首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断模板类型是否是模板类的实例?

如何判断模板类型是否是模板类的实例?
EN

Stack Overflow用户
提问于 2017-05-16 22:59:57
回答 4查看 7.4K关注 0票数 10

我有一个函数,它采用模板类型来确定返回值。是否有任何方法在编译时判断模板类型是否是模板类的实例化?

例如。

代码语言:javascript
运行
复制
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>>();

我知道有可能通过做

代码语言:javascript
运行
复制
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实例化,我不想测试所有可能的类型。

EN

Stack Overflow用户

发布于 2020-04-05 10:11:11

对@RichardHodges的回答的另一个改进是:通常,人们不仅希望捕获普通类型,而且希望捕获所有cv限定类型和ref限定类型。

换句话说,如果is_instance<A, Second>{}是真的,那么is_instance<A const&, Second>{}is_instance<A&&, Second>{}也应该是真。这个线程中的当前实现不支持这一点。

以下代码说明了所有cv-ref限定类型,方法是添加另一个间接方向和一个std::decay_t

代码语言:javascript
运行
复制
namespace
{
    template <typename, template <typename...> typename>
    struct is_instance_impl : public std::false_type {};

    template <template <typename...> typename U, typename...Ts>
    struct is_instance_impl<U<Ts...>, U> : public std::true_type {};
}

template <typename T, template <typename ...> typename U>
using is_instance = is_instance_impl<std::decay_t<T>, U>;

把它当作

代码语言:javascript
运行
复制
#include <iostream>

template <typename ...> struct foo{};
template <typename ...> struct bar{};

int main()
{
    std::cout << is_instance<foo<int>, foo>{} << std::endl;           // prints 1
    std::cout << is_instance<foo<float> const&, foo>{} <<std::endl;   // prints 1
    std::cout << is_instance<foo<double,int> &&, foo>{} << std::endl; // prints 1
    std::cout << is_instance<bar<int> &&, foo>{} << std::endl;        // prints 0
}
票数 5
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44012938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档