Ich habe folgendes Templat-Objekt:Wie verwende ich std :: enable_if, um Konstruktoren je nach Vorlagentypen zu aktivieren oder zu deaktivieren?
template< typename type_1, typename type_2 > struct result
{
// I want to enable these two constructors only if type_1 != type_2
result(type_1 f) : foo{f} {}
result(type_2 b) : bar{b} {}
// I want to enable this constructor only if type_1 == type_2
result(type_1 f, type_2 b) : foo{f}, bar{b} {}
// Other member functions removed.
type_1 foo;
type_2 bar;
};
Wie verwende ich std::enable_if
die Konstrukteure zu aktivieren oder deaktivieren wie gewünscht?
zB:
Dies würde man nur die ersten beiden Konstrukteure haben:
result<string,int> // type_1 != type_2
Dies würde nur den dritten Konstruktor:
result<int,int> // type_1 == type_2
Ich habe meine Frage aktualisiert, um zu erwähnen, dass das 'result' Objekt eine Reihe von Member-Funktionen hat, die nicht gezeigt werden, so würde Spezialisierung zu viel Code-Duplikation führen. –
@DrTwox Dann Bryan Lösung verwenden. Leider sind mir im Moment keine Alternativen bekannt. – 0x499602D2
@DrTwox Sie können die Vererbung verwenden, um diese Wiederholung zu vermeiden, indem Sie den allgemeinen Code in eine Klasse und den spezialisierten Code in die andere Klasse einfügen. Dies ist eine übliche Lösung. Sie können dies auf verschiedene Arten tun, einschließlich CRTP, abhängig von Ihrer Situation. Beispielsweise könnten Sie die Konstruktoren (und Datenelemente) in einer Basisklasse haben, die Sie für beide Fälle (Typen gleich oder nicht) spezialisieren, und dann geerbte Konstruktoren (C++ 11) in Ihrer abgeleiteten Klasse verwenden. Oder das Gegenteil, spezialisieren Sie eine dünne abgeleitete Klasse mit dem gesamten Code in der Basisklasse. –