2010-11-17 9 views
5

Gibt es eine Aktualisierung in der kommenden ++ 0x-Standard C auf benannte Parameter in Vorlagen und/oder Funktionen? Zum Beispiel würde ich folgendes können gerne schreiben:Benannt? Vorlagen Parameter, Funktionen

template<class T = int,class Policy_1, class Policy_2> 
class X 
{ 
}; 

dann in Haupt:

X<Policy_2: NoReturn> x; 

das gleiche mit Funktionen;

hat vorher definiert mit:

void f(int arg_1 = 0, int arg_2 = 1, int arg_3 = 2) 
{ 
} 

dann in Haupt:

f(arg_3: 55); 

Antwort

9

Für Funktionen können Sie die Benannte Parameter Idiom (in C++ 98 und C++ 0x) verwenden.

See C++ FAQ Artikel 10.20 What is the "Named Parameter Idiom"?.

Für Vorlage Argumente ich glaube, Sie die Idee der Verpackung verwenden können, „Typenträger“ Typen verwenden, die das Template-Argument sind sie durch ihre Art kodieren. Es wird komplex. Sie könnten die Boost-Parameter-Bibliothek für Ideen überprüfen, aber im Wesentlichen, für eine Vorlage Argumente, die ich glaube nicht, es lohnt sich viel Zeit auf (nicht eigentlich mit ganz zu schweigen) - es akademisch ist.

Beifall & hth.,

+0

+1 für nicht fälschlich sagen, dass es unmöglich ist: p –

+1

Ich habe eine gefunden Viele Nutzungen dafür. Bei der Arbeit mit richtlinienbasiertem Design, wo es 10 oder mehr Vorlagenparameter geben kann, ist es sehr hilfreich. Boost.Parameter erstellt unordentlichen Implementierungscode, aber saubere und einfach zu verwendende Schnittstellen. –

+0

@Noah: Die MPL ist dafür ausreichend (gekoppelt mit der Typenträger-Idee). Eine andere Lösung, die ich gefunden habe, besteht darin, einfach nach einem "Tag" -Innentyp zu fragen, der in jeder Richtlinie definiert wird, der angibt, welcher Kategorie er angehört.Beide sind relativ schlank. –

0

Nein, das wird nicht in C++ 0x arbeiten.

8

nicht mit dieser Syntax und obwohl es leichter wird, die solche Konstrukte zu verwenden, sie schaffen, ist eher chaotisch.

See Boost.Parameter

Sie am Ende mit

typedef template_by_named< policy1<type1>, policy2<type2> > x; 

und

f(param_b = 23, param_d = 42) 
+3

Manchmal frage ich mich, ob es etwas gibt, Dave Abrahams nicht in C++ schreiben könnte ... –

-4

Der Rest von uns nur Argument structs verwendet und bekam darüber. Und nein.

+8

-1 pointlessly widerwärtig und wenig hilfreich. –

+1

+1, einigermaßen lapidare und wahrhaftig. – MSN

+0

Ich würde hinweisen http://www.boost.org/doc/libs/1_44_0/libs/parameter/doc/html/index.html – KitsuneYMG

0

This article beschreibt eine Technik, die verwendet werden können, benannte Template-Parameter zu emulieren.

Beispiel Syntax:

enum class bars { bar1, bar2, bar3 }; 

// Omitted definitions of get_value, is_present, get_type, a, b, c and d. 

template <typename... Args> 
struct foo { 
    static constexpr auto A = get_value<a<1>, Args...>::value; 
    static constexpr auto B = get_value<b<bars::bar2>, Args...>::value; 
    static constexpr auto C = is_present<c, Args...>::value; 

    using D = typename get_type<d<char>, Args...>::value; 
}; 

// Client code 
foo<d<float>, a<42>> f; 
// f::A equals to 42; 
// f::B equals to defaulted bars::bar2; 
// f::C equals to false, because c is not present among temlate arguments; 
// f::D equals to float