我有一个函数,它采用模板类型来确定返回值。有没有什么方法可以在编译时判断模板类型是否是某个模板类的示例化?
前
class First { /* ... */ };
template <typename T>
class Second { /* ... */ };
using MyType = boost::variant<First, Second<int>, Second<float>>;
template <typename SecondType>
auto func() -> MyType {
static_assert(/* what goes here?? */, "func() expects Second type");
SecondType obj;
// ...
return obj;
}
MyType obj = func<Second<int>>();
我知道有可能通过做
template <typename T>
auto func() -> MyType {
static_assert(std::is_same<T, int>::value || std::is_same<T, float>::value,
"func template must be type int or float");
Second<T> obj;
// ...
return obj;
}
MyType obj = func<int>();
我只是好奇,是否有一种方法来测试一个类型是否是一个模板类的示例化?因为如果MyType
最终有6个Second
示例化,我不想测试所有可能的类型。
4条答案
按热度按时间ubof19bj1#
这里有一个选项:
它基本上是为模板的示例化类型专门化
is_instance
结构。hc2pp10m2#
另一个选择,拿起亨利的评论:
vddsk6oq3#
对@RichardHodges的回答的另一个改进:通常,人们不仅要捕获普通类型,还要捕获所有 * cv限定 * 和 * ref限定 * 类型。
换句话说,如果
is_instance<A, Second>{}
为真,那么is_instance<A const&, Second>{}
或is_instance<A&&, Second>{}
也应该为真。此线程中的当前实现不支持此功能。下面的代码通过添加另一个间接寻址和
std::remove_cvref_t
来说明所有cv-ref限定类型:把它当作
vd2z7a6w4#
这适用于
int
模板参数。