假設我有一個模板類是這樣的:測試,如果模板參數定義一個特定的類型名稱
template<typename T>
class Foo {};
像一個類:
class PossibleArg
{ typedef int required_type; }
是否可以寫在類Foo一個static_assert它檢查T :: required_type是否被定義?
假設我有一個模板類是這樣的:測試,如果模板參數定義一個特定的類型名稱
template<typename T>
class Foo {};
像一個類:
class PossibleArg
{ typedef int required_type; }
是否可以寫在類Foo一個static_assert它檢查T :: required_type是否被定義?
或許真的是這樣的:
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");
};
您可以使用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_。)
如果你的目標是?得到一個編譯錯誤,如果T沒有一個required_type你可以只的typedef它美孚還是我失去了一些東西
template<typename T>
class Foo {
typedef typename T::required_type T_required_type;
};
是的,那是我現在如何解決問題。但是因爲C++ 0x定義了static_assert,所以使用它似乎是一個更好的解決方案。 – cytrinox 2011-03-14 21:20:05
如果你實際上是在尋找static_assert,有類似的東西在這裏 - Static assert without boost or C++0x
我尋找不需要三階解決方案黨的庫像增強。 – cytrinox 2011-03-14 21:18:37