2017-10-19 11 views
1

私は2つのテンプレートで定義されたクラスを持っています。他のテンプレートに基づいて、テンプレートクラスからプリミティブ型への暗黙的な変換を定義します。

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

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

クラスとテンプレートの最初の型の間の暗黙の変換を定義したいが、テンプレート上の特定の第2の型に対してのみ変換を定義したい。 AはC++プリミティブ型なので、私はその側で変換を定義することはできません。私はこの

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

ようstd::enable_ifを試してみましたが、私はコンパイルエラー

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

B = specific_B_typeに特化し、クラス全体を定義することなくこれを行うにはどのような方法がありますを取得しますか?

+0

残念ながら、私の答えは実際には機能しないことが判明しました。これは、オペレータだけでなくクラス全体のインスタンス化を無効にしているようです...それを受け入れることができないので削除できますか? :) – Knoep

+0

別の(はるかに単純な)解決策を見つけました。それはあなたが欲しいものですか? – Knoep

+0

私は現在、 'template :: value、void> :: type>'という最初のソリューションを使用しています。それは動作するようですが、私はそれを十分にテストしていないかもしれません。あなたの最高の解決策は何ですか?前もって感謝します! – mbtg

答えて

1

あなたは、変換を許可すべきかどうかをチェックするためにstatic_assertを使用することができます。

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

しかし、Bspecific_B_typeでない場合は、Aへの明示的な変換を持っていないことを意味しています。必要な場合は、テンプレートパラメータに基づいてメンバーを追加および削除することに関するthis質問の回答をご覧ください。

関連する問題