Es ist nicht möglich mit Ihrer aktuellen Schnittstelle nicht-type Parameter zu verwenden.
Sie können stattdessen Typ Parameter übernehmen und die Werte in einer std::integral_constant
wickeln:
template<class X, class Y, class Z>
class A { /* stuff */ };
// use as:
A<std::integral_constant<Color, Color::Red>,
std::integral_constant<ShowAxes, ShowAxes::True>,
std::integral_constant<ShowLabels, ShowLabels::True>> a;
Das ist ziemlich ausführlich, so dass Sie ein Makro schreiben könnte in Erwägung ziehen:
#define AS_IC(Value) std::integral_constant<decltype(Value), Value>
und schreiben als
A<AS_IC(Color::Red), AS_IC(ShowAxes::True), AS_IC(ShowLabels::True)> a;
Den Wert des gewünschten Typs aus der Liste 0 extrahierens ist einfach:
template<class Result, class...>
struct extract;
template<class Result, Result Value, class... Tail>
struct extract<Result, std::integral_constant<Result, Value>, Tail...> : std::integral_constant<Result, Value> {};
template<class Result, class Head, class... Tail>
struct extract<Result, Head, Tail...> : extract<Result, Tail...> {};
Dann können Sie
tun
// inside the definition of A
static constexpr Color col = extract<Color, X, Y, Z>::value;
Demo.
Dies kann jedoch nicht erzeugen, die gleiche Klasse, aber Sie können eine Klassenvorlage A_impl
, die wie Ihre A
mit nicht-Typ Parametern verhält sich machen, und dass die tatsächliche Umsetzung enthält, und dann A
eine Alias-Vorlage machen:
template< Color, ShowAxes, ShowLabels >
class A_impl
{/* stuff */};
template<class X, class Y, class Z>
using A = A_impl<extract<Color, X, Y, Z>::value,
extract<ShowAxes, X, Y, Z>::value,
extract<ShowLabels, X, Y, Z>::value>;
Jetzt gegeben
A<AS_IC(Color::Red), AS_IC(ShowAxes::True), AS_IC(ShowLabels::True)> a;
A<AS_IC(Color::Red), AS_IC(ShowLabels::True), AS_IC(ShowAxes::True)> b;
a
und b
denselben Typ haben. Demo.
Als Alternative können Sie auch decltype
und Überlastungen Funktionsschablonen verwenden, aber das erfordert eine Funktion Template-Deklaration für jede mögliche Reihenfolge der Typen ergänzt:
template< Color c, ShowAxes a, ShowLabels l>
A<c,a,l> A_of();
template< ShowAxes a, ShowLabels l, Color c>
A<c,a,l> A_of();
// etc.
decltype(A_of<Color::Red, ShowAxes::True, ShowLabels::True>()) a1;
decltype(A_of<ShowAxes::True, ShowLabels::True, Color::Red>()) a2;
C++ Klasse Template-Spezialisierung? –
@BryanChen Sie können die Arten von Parametern mit einer Spezialisierung –
nicht ändern Ich möchte nicht die Arten von Parametern ändern. Die Spezialisierung ist eine gute Idee, aber ich habe 3! = 6 Permutationen. Außerdem werde ich weitere Parameter hinzufügen. –