2017-01-12 6 views
0

Ich habe diese Struktur:Typdeklaration spezifischen Konstruktor mit spezifischen Parametern

struct A { 
    A(int a, bool b):a(a), b(b) {}; 
    int a; 
    bool b; 
} 

Kann ich irgendwie eine Art Erklärung für bestimmte Konstruktoraufruf mit spezifischen Parametern deklariert?

Ich meine, so etwas wie das:

typedef A(2, false) A_2_false; 

So konnte ich diese wie folgt verwenden:

const A a_func() { return A_2_false; }; 
  • Es std::bind erinnert, wo Sie eine Funktion aufrufen und einige Set vorbestellt können die Variablen anstelle von std::place_holders.

  • Ich habe versucht, std::integral_constant aber ohne Glück zu verwenden.

  • Ich will nicht #define

Dank

verwenden --- --- UPDATE

Was zu erreichen Ich versuche:

I‘ m Schreiben einer Rückruffunktion:
typedef std::function<const A()> CbFunc
A Ein einfacher Benutzer sollte CbFunc verwenden und const A zurückgeben. Ich wollte die Dinge vereinfachen machen, so dass ein Benutzer Callback-Funktion sein könnte:

const A userCbFunc() { 
    ... 
    ... 
    // Good thing happend 
    return A_2_false; 
    ... 
    ... 
    // Bad thing happend 
    return A(99, true); 
} 

ich den Good thing happened Rückgabetyp weiter vereinfacht, machen wollte, so wäre es A_2_false statt A(2, false) sein.

Dann verwende ich die Strukturelemente, wenn die Funktion zurückgibt.

+0

Btw: Top-Ebene const macht nicht viel Sinn auf Rückgabewerte und wird sogar von einigen Compilern gewarnt, denke ich. –

+0

Was möchten Sie erreichen? Vielleicht [Templates] (https://en.wikipedia.org/wiki/Template_%28C%2B%2B%29) sind was Sie suchen? Eine andere Option könnte das [Fabrikmuster] sein (https://en.wikipedia.org/wiki/Factory_method_pattern). – sigy

Antwort

5

nur eine einfache Funktion sollte es tun:

A A_2_false() { return A(2, false); } 

Verbrauch:

A a_func() 
{ 
    return A_2_false(); 
} 

Auch wenn dies formal ein paar Kopien erfordert, werden alle Kopien sind für Kopie elision und somit kann dieser Code effektiv genauso gut wie das Original-Code übersetzt werden. C++ 17 macht diese Kopie sogar zwingend erforderlich.

Sie könnten auch A_2_false eine statische Member-Funktion von A machen, wenn dieser Sinn aus der Sicht des Designs von A machen:

struct A 
{ 
    static A two_false() { return A(2, false); } 

    // ... 
}; 


A a_func() 
{ 
    return A::two_false(); 
} 

Dies wird manchmal als „genannt Konstruktor“ Idiom.

2

Was eine Lambda-Funktion

über die Verwendung von
auto A_2_false = []() { return A(2, false); }; 

und dann

mit rufen
A myA = A_2_false(); 
2

Was ist ein lambda:

#include <iostream> 
struct A { 
    A(int a, bool b):a(a), b(b) {}; 
    int a; 
    bool b; 
}; 

auto make_A_default = [] 
{ 
    return A(2, false); 
}; 

A a_func() 
{ 
    return make_A_default(); 
} 

int main() 
{ 
    auto a = a_func(); 
    a.a = 5; 
} 
2

Ein einfacher Weg wäre, eine Kopie zu erstellen:

const A A_2_false(2, false); // a global, reusable instance 

A a_func() { 
    return A_2_false; 
}; 
1

versuchen diese

struct A { 
    A(int a=2, bool b=true):a(a), b(b) {}; 
     int a; 
     bool b; 
    } 
1

Vorlagen hilfreich sein könnten.