这个问题已经在这里有一个答案:
- 做一个static_assert,一个模板类型的另一个模板 3个回答
是否有可能检查一个类型是一个特定模板的一个实例?
我有一个类模板,其中所述模板参数的一个必须是一个特定的模板的实例化,或一些其它类型的。 例如,考虑一个类型串的这个简单的定义:
struct null_type;
template <typename Head, typename Tail>
struct typelist
{
// Tail must be a typelist or null_type
typedef Head head;
typedef Tail tail;
};
现在,我想,以确保规定的类型Tail
模板参数始终为的一个实例typelist
或null_type
。 我可以使用局部特殊化来定义模板只为那些情况下,像这样的:
template <typename Head, typename Tail>
struct typelist; // default, not defined
template <typename Head, typename H, typename T>
struct typelist< Head, typelist<H,T> > // Tail = typelist, ok
{
typedef Head head;
typedef typelist<H,T> tail;
};
template <typename Head>
struct typelist< Head, null_type > // Tail = null_type, ok
{
typedef Head head;
typedef null_type tail;
};
然而,我最终复制代码,这是我想避免的。 理想情况下,我需要一个性状测试类型是否是一个模板的实例,与使用enable_if
或静态断言:
#include <boost/mpl/or.hpp>
#include <type_traits>
struct null_type;
template <typename Head, typename Tail>
struct typelist
{
static_assert(
boost::mpl::or_<
is_instantiation_of< typelist, Tail >,
std::is_same< Tail, null_type >
>::value,
"Tail must be a typelist or null_type" );
typedef Head head;
typedef Tail tail;
};
就是这样一个特质( is_instantiation_of
)标准库或升压已经可用? 是可以写一个?