以下のコードを使用して、最初の2つのテンプレート間でget_codeの呼び出しが曖昧であるというコンパイラーの苦情を受け取ります。特殊なフォームを提供しながら、ベースクラスを検出するコードを作成するにはどうすればよいですか?たとえば、後でclass C : A {}
があり、これもACLASS
を返す必要があります。どのようにして、is_base_ofを使用してテンプレートを特化できますか?プライマリテンプレートとあいまいではありませんか?
T
が
A
のベースであるとき、コンパイラは
get_code()
の2つのバージョンを使用することができますし、選択することはできません、
T
がそうでなければ
A
template <typename T>
typename std::enable_if< ! std::is_base_of<A, T>::value, Code>::type
get_code() // -----------^
{ return Code::UNKNOWN; }
のベースであるとき、未知の場合を無効にする必要があり
class A {};
class B : A {};
class D {};
enum Code { UNKNOWN, ACLASS, DCLASS };
template <typename T>
Code get_code() { return Code::UNKNOWN; }
template <typename T>
typename std::enable_if<std::is_base_of<A, T>::value, Code>::type
get_code() { return Code::ACLASS; }
template <>
inline Code get_code<D>() { return Code::DCLASS; }
Code test1 = get_code<D>(); // OK, chooses DCLASS
Code test2 = get_code<B>(); // ambiguous call to overloaded function
のようなものを呼び出すソリューションである回避できることを避けるために追加された[この](http://melpon.org/wandbox/permlink/N3MCPAclgAfI63J4)何探しています? – skypjack
はい、これも良い解決策のように見えます! – Glenn