2017-10-19 7 views
1

Ich habe eine Klasse durch zwei Vorlagen definiert.definieren implizite Konvertierung von Vorlagenklasse zu primitiven Typ basierend auf anderen Vorlage

template<typename A, typename B> my_class { 
private: 
    A value; 

public: 
    operator A() { 
     return this->value; 
    } 
}; 

Ich mag eine implizite Konvertierung zwischen der Klasse und der ersten Art in der Vorlage definieren, aber nur für einen bestimmten zweiten Typen auf der Schablone. Da A ein C++ primitiver Typ ist, kann ich die Konvertierung auf dieser Seite nicht definieren. Ich habe versucht, std::enable_if wie diese

operator typename std::enable_if<std::is_same<B, specific_B_type>::value, NumT>::type() { 
    return this->value; 
} 

aber ich habe den Kompilierungsfehler

Error C2833 'operator type' is not a recognized operator or type dimensional_analysis 

Gibt es eine Möglichkeit, dies zu tun, ohne die gesamte Klasse für B = specific_B_type spezialisiert zu definieren?

+0

Leider habe ich gerade festgestellt, dass meine Antwort nicht wirklich funktioniert ... Es scheint, dass dies die gesamte Klasseninstanziierung deaktiviert, nicht nur den Operator ... Könnten Sie es nicht akzeptieren, damit ich es löschen kann? :) – Knoep

+0

Okay, fand eine andere (viel einfachere) Lösung. Ist das immer noch was du willst? – Knoep

+0

Ich verwende derzeit die erste Lösung, die Sie gegeben haben: template :: value, void> :: type> '. Es scheint zu funktionieren, aber ich habe es vielleicht nicht gründlich genug getestet. Was ist deine beste Lösung? Danke im Voraus! – mbtg

Antwort

1

Sie einen static_assert verwenden können, wenn die Umwandlung erlaubt sein sollte, überprüfen:

operator A() 
{ 
    static_assert(std::is_same<B, specific_B_type>::value, "No conversion possible");  
    return this->value; 
} 

bedeutet jedoch, dass Sie nicht eine explizite Umwandlung in A haben kann, wenn B nicht specific_B_type ist. Wenn Sie das benötigen, können Sie sich die Antworten auf die Frage this zum Hinzufügen und Entfernen von Elementen anhand von Vorlagenparametern ansehen.

Verwandte Themen