2011-12-21 10 views
3

使用方法がありますか置換エラーは列挙型のエラー(SFINAE)ではありませんか?その後置換エラーは列挙型のエラー(SFINAE)ではありません

template <typename T> 
struct Traits 
{ 
} 
template <> 
struct Traits<A> 
{ 
}; 
template <> 
struct Traits<B> 
{ 
    enum 
    { 
    iOption = 1 
    }; 
}; 

template <T> 
void Do() 
{ 
    // use Traits<T>::iOption 
}; 

Do<B>();作品やDo<A>();が失敗しました。ただし、iOptionが存在しない場合は、デフォルトの動作を提供できます。 DoTo DoOptionの一部を分離します。今

template <typename T, bool bOptionExist> 
void DoOption() 
{ 
    // can't use Traits<T>::iOption. do some default behavior 
}; 
template <typename T> 
void DoOption<T, true>() 
{ 
    // use Traits<T>::iOption 
}; 
template <T> 
void Do() 
{ 
    // 'Do' does not use Traits<T>::iOption. Such codes are delegated to DoOption. 
    DoOption<T, DoesOptionExist<T> >(); 
}; 

、行方不明の作品はDoesOptionExist<T>ある - iOptionが構造体に存在するかどうかをチェックするための方法。 確かにSFINAEは関数名や関数のシグネチャとして機能しますが、 はenum値として機能します。

+0

私はあなたがそれを削除したときに私の答えを書くのを終えたので、この質問を元に戻したことに注意してください。 :) – Xeo

+0

あなたは正確に何を達成したいですか? –

答えて

6

あなたがC++ 11を使用することができる場合、これは完全に簡単です:

template<class T> 
struct has_nested_option{ 
    typedef char yes; 
    typedef yes (&no)[2]; 

    template<class U> 
    static yes test(decltype(U::option)*); 
    template<class U> 
    static no test(...); 

    static bool const value = sizeof(test<T>(0)) == sizeof(yes); 
}; 

C++ 03のバージョンが(意外に)似ています

template<class T> 
struct has_nested_option{ 
    typedef char yes; 
    typedef yes (&no)[2]; 

    template<int> 
    struct test2; 

    template<class U> 
    static yes test(test2<U::option>*); 
    template<class U> 
    static no test(...); 

    static bool const value = sizeof(test<T>(0)) == sizeof(yes); 
}; 

使用法:

struct foo{ 
    enum { option = 1 }; 
}; 

struct bar{}; 

#include <type_traits> 

template<class T> 
typename std::enable_if< 
    has_nested_option<T>::value 
>::type Do(){ 
} 

int main(){ 
    Do<foo>(); 
    Do<bar>(); // error here, since you provided no other viable overload 
} 
+0

質問が既に他の投稿によって回答されていることがわかったので削除しました。それでも、C++ 11の答えはすばらしく見えます。 – xosp7tom

関連する問題