2017-10-19 26 views
1

J'ai une classe définie par deux modèles.Définir la conversion implicite d'une classe de modèle en type primitif basée sur un autre modèle

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

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

Je veux définir une conversion implicite entre la classe et le premier type dans le modèle, mais seulement pour un second type spécifique sur le modèle. Puisque A est un type primitif C++ je ne peux pas définir la conversion de ce côté. J'ai essayé std::enable_if comme ça

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

mais je reçois l'erreur de compilation

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

Est-il possible de le faire sans avoir à définir toute la classe spécialisée pour B = specific_B_type?

+0

Malheureusement, je viens de découvrir que ma réponse ne fonctionne pas ... Il semble que cela désactive toute l'instanciation de la classe, pas seulement l'opérateur ... Pourriez-vous la désactiver, donc je peux la supprimer? :) – Knoep

+0

D'accord, trouvé une autre solution (beaucoup plus simple). Est-ce toujours ce que tu veux? – Knoep

+0

J'utilise actuellement la première solution que vous avez donnée 'template :: value, void> :: type>'. Cela semble fonctionner, mais je ne l'ai peut-être pas suffisamment testé. Quelle est ta meilleure solution? Merci d'avance! – mbtg

Répondre

1

Vous pouvez utiliser un static_assert pour vérifier si la conversion doit être autorisé:

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

Cependant, cela signifie que vous ne pouvez pas avoir une conversion explicite à A si B n'est pas specific_B_type. Si vous avez besoin de cela, vous pouvez jeter un oeil aux réponses this question sur l'ajout et la suppression de membres en fonction des paramètres du modèle.