如何检查嵌套模板的类型?
How to check a type for a nested template?
我想创建一个类型特征来检测嵌套 class 模板是否存在于其他感兴趣的类型中。
例如,假设我想创建类型特征 has_foo
,它检测在某种类型 T
中是否存在一个名为 foo
的参数的嵌套模板:
#include <cassert>
template<class T>
struct has_foo
{
// XXX what goes here?
};
struct with_foo
{
template<class T> struct foo {};
};
struct without_foo {};
int main()
{
assert(has_foo<with_foo>::value);
assert(!has_foo<without_foo>::value);
return 0;
}
实施 has_foo
的最佳方法是什么?
template <template<class> class> using void_templ = void;
template <typename, typename=void> struct has_foo : std::false_type {};
template <typename T>
struct has_foo<T, void_templ<T::template foo>> : std::true_type {};
Demo。 GCC 将在这里允许任何类型;那是一个错误。要解决此问题,请将 void_templ
设为 class 模板
template <template<class> class>
struct void_templ {using type = void;};
Demo.
我想创建一个类型特征来检测嵌套 class 模板是否存在于其他感兴趣的类型中。
例如,假设我想创建类型特征 has_foo
,它检测在某种类型 T
中是否存在一个名为 foo
的参数的嵌套模板:
#include <cassert>
template<class T>
struct has_foo
{
// XXX what goes here?
};
struct with_foo
{
template<class T> struct foo {};
};
struct without_foo {};
int main()
{
assert(has_foo<with_foo>::value);
assert(!has_foo<without_foo>::value);
return 0;
}
实施 has_foo
的最佳方法是什么?
template <template<class> class> using void_templ = void;
template <typename, typename=void> struct has_foo : std::false_type {};
template <typename T>
struct has_foo<T, void_templ<T::template foo>> : std::true_type {};
Demo。 GCC 将在这里允许任何类型;那是一个错误。要解决此问题,请将 void_templ
设为 class 模板
template <template<class> class>
struct void_templ {using type = void;};
Demo.