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

卡梅伦·罗

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

前任。

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实例,我不想测试所有可能的类型。

法提赫·巴基尔

这是一个选项:

#include <iostream>
#include <type_traits>
#include <string>

template <class, template <class> class>
struct is_instance : public std::false_type {};

template <class T, template <class> class U>
struct is_instance<U<T>, U> : public std::true_type {};

template <class>
class Second 
{};

int main()
{
    using A = Second<int>;
    using B = Second<std::string>;
    using C = float;
    std::cout << is_instance<A, Second>{} << '\n'; // prints 1
    std::cout << is_instance<B, Second>{} << '\n'; // prints 1
    std::cout << is_instance<C, Second>{} << '\n'; // prints 0
}

它基本上是专门is_instance为模板实例化类型结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何判断两个模板类是否为同一类型

来自分类Dev

检查某种类型是否是模板类std :: optional的实例

来自分类常见问题

如何基于模板化类型的祖先限制类的实例化

来自分类Dev

如何基于模板化类型的祖先限制类的实例化

来自分类Dev

如何在模板类中实例化T类型

来自分类Dev

Java模板如何返回带有模板类型的函数参数类类型实例

来自分类Dev

使用基于类实例类型的模板

来自分类Dev

C ++模板类类型实例化

来自分类Dev

如何确定从类模板继承的模板参数的基础模板类型?

来自分类Dev

检查类是否从模板的任何模板实例继承

来自分类Dev

模板类的非模板朋友是否被实例化?

来自分类Dev

检查类是否从模板的任何模板实例继承

来自分类Dev

实例化类时是否实例化了类模板的成员?

来自分类Dev

如何检查模板类型是否为其他模板类型?

来自分类Dev

如何判断两个javascript实例是否属于同一类类型?

来自分类Dev

typedef模板类实例

来自分类Dev

类模板的成员函数的显式实例化声明是否导致类模板的实例化?

来自分类Dev

如何在模板函数或类中实例化包含类型的容器的变量?

来自分类Dev

如何使用类的类型作为模板的参数

来自分类Dev

如何检查模板类方法的返回类型?

来自分类Dev

如何从模板类的范围中获取类型?

来自分类Dev

如何检查对象是否是C ++中模板类的实例?

来自分类Dev

如何判断模板中是否存在对象?

来自分类Dev

实例化类型模板类的非类型模板成员函数

来自分类Dev

类模板实例化中的携带类型信息

来自分类Dev

模板:使用类类型的成员实例化对象

来自分类Dev

类模板的静态成员是否隐式实例化?

来自分类Dev

每个实例的模板类的静态constexpr成员是否不同?

来自分类Dev

使用模板参数实例化模板类

Related 相关文章

  1. 1

    如何判断两个模板类是否为同一类型

  2. 2

    检查某种类型是否是模板类std :: optional的实例

  3. 3

    如何基于模板化类型的祖先限制类的实例化

  4. 4

    如何基于模板化类型的祖先限制类的实例化

  5. 5

    如何在模板类中实例化T类型

  6. 6

    Java模板如何返回带有模板类型的函数参数类类型实例

  7. 7

    使用基于类实例类型的模板

  8. 8

    C ++模板类类型实例化

  9. 9

    如何确定从类模板继承的模板参数的基础模板类型?

  10. 10

    检查类是否从模板的任何模板实例继承

  11. 11

    模板类的非模板朋友是否被实例化?

  12. 12

    检查类是否从模板的任何模板实例继承

  13. 13

    实例化类时是否实例化了类模板的成员?

  14. 14

    如何检查模板类型是否为其他模板类型?

  15. 15

    如何判断两个javascript实例是否属于同一类类型?

  16. 16

    typedef模板类实例

  17. 17

    类模板的成员函数的显式实例化声明是否导致类模板的实例化?

  18. 18

    如何在模板函数或类中实例化包含类型的容器的变量?

  19. 19

    如何使用类的类型作为模板的参数

  20. 20

    如何检查模板类方法的返回类型?

  21. 21

    如何从模板类的范围中获取类型?

  22. 22

    如何检查对象是否是C ++中模板类的实例?

  23. 23

    如何判断模板中是否存在对象?

  24. 24

    实例化类型模板类的非类型模板成员函数

  25. 25

    类模板实例化中的携带类型信息

  26. 26

    模板:使用类类型的成员实例化对象

  27. 27

    类模板的静态成员是否隐式实例化?

  28. 28

    每个实例的模板类的静态constexpr成员是否不同?

  29. 29

    使用模板参数实例化模板类

热门标签

归档