2011-03-14 28 views
2

假設我有一個模板類是這樣的:測試,如果模板參數定義一個特定的類型名稱

template<typename T> 
class Foo {}; 

像一個類:

class PossibleArg 
{ typedef int required_type; } 

是否可以寫在類Foo一個static_assert它檢查T :: required_type是否被定義?

+0

我尋找不需要三階解決方案黨的庫像增強。 – cytrinox 2011-03-14 21:18:37

回答

3

或許真的是這樣的:

template <typename T> 
class Foo { 
    static_assert(sizeof(T::required_type) > 0, "Never shows up"); 
}; 

編輯:其他方式:SFINAE

template <typename T> 
struct has_required_type 
{ 
    typedef char yes[1]; 
    typedef char no[2]; 

    template <typename C> 
    static yes& test(typename C::required_type*); 

    template <typename> 
    static no& test(...); 

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

template <typename T> 
class Foo { 
    static_assert(has_required_type<T>::value, "Hasn't required type"); 
}; 
2

您可以使用BOOST_MPL_HAS_XXX_TRAIT_DEF,在Boost.MPL:

BOOST_MPL_HAS_XXX_TRAIT_DEF(required_type) 

BOOST_MPL_ASSERT((has_required_type<PossibleArg>)); 

BOOST_MPL_HAS_XXX_TRAIT_DEF是一個宏觀的,採取的名字xxx作爲參數,如果T定義一個名爲xxx嵌套類型生成元函數has_xxx<T>計算結果爲真。

(注意,MPL元函數是一個編譯時功能,其結果可以用::type進行訪問。在這種情況下,結果是一個編譯時的布爾常量(即bool_。)

2

如果你的目標是?得到一個編譯錯誤,如果T沒有一個required_type你可以只的typedef它美孚還是我失去了一些東西

template<typename T> 
class Foo { 
    typedef typename T::required_type T_required_type; 
}; 
+0

是的,那是我現在如何解決問題。但是因爲C++ 0x定義了static_assert,所以使用它似乎是一個更好的解決方案。 – cytrinox 2011-03-14 21:20:05

相關問題