3

タイトルに記載されていることを実行しようとしています。

template <class T>
void foo(const Foo* f) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type 
  foo(const Foo* f)
{
  T::_Foo = f;
} 

しかし、それはコンパイルに失敗します:

error C2039: 'type' : is not a member of 'std::enable_if<false,void>'

enable_if が失敗した場合、デフォルトで最初の実装にすべきではありませんか? ここで何が欠けているのか、誰かが何が間違っているのか、そしておそらく解決策を教えてください。(問題はこの単純な decltype(T::_Foo) にあると感じています)

4

1 に答える 1

2

推定されたテンプレート引数が含まれている場合にのみ機能します。おそらく、間接的なレベルを追加する必要がT あり、適切な_Foo. または、別の方法として、...vs.を使用してオーバーロード解決の優先度を下げる方法を示しintます。

template <class T>
void foo_impl(const Foo* f, T*, ...) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type 
  foo_impl(const Foo* f, T*, int)
{
   T::_Foo = f;
}

template <class T>
void foo(const Foo* f) // this is general case template
{
    return foo_impl(f, (T*)nullptr, 0);
}

実際の例

于 2013-10-22T16:33:13.170 に答える