当前位置: 首页 > 知识库问答 >
问题:

有没有办法检测混合类型和非类型的任意模板类?

郗唯
2023-03-14

是否有任何方法可以检测一个类是正常类型还是包含非类型参数的模板类型(元类型)的实例化?我想出了这个解决方案:

#include <iostream>

template <template<class...> class> 
constexpr bool is_template()
{
    return true;
}

template <class> 
constexpr bool is_template()
{
    return false;
}

struct Foo{};

template<class> struct TemplateFoo{};

template<class, int> struct MixedFoo{};

int main()
{
     std::cout << std::boolalpha;
     std::cout << is_template<Foo>() << std::endl;  
     std::cout << is_template<TemplateFoo>() << std::endl;  
     // std::cout << is_template<MixedFoo>() << std::endl; // fails here
}

但是,对于混合了非类型和类型的模板,例如

template<class, int> struct MixedFoo{};

除了必须显式指定重载中的类型之外,我无法提出任何解决方案。当然,由于组合爆炸,这是不合理的。

相关问题(不是欺骗):是否可以仅通过标识符检查成员模板的存在?

共有2个答案

董新觉
2023-03-14

我想这是不可能的。

无论如何,您可以使用另一种方法来推导N

template<class, class> struct MixedFoo;
template<class C, int N> struct MixedFoo<C, std::integral_constant<int, N>>{};

现在,这将返回预期的true

 std::cout << is_template<MixedFoo>() << std::endl; // fails here

当然,您将无法再将MixedFoo用作MixedFoo

杨研
2023-03-14

不,没有。

请注意,模板类本身不是类。它们是类的模板。

 类似资料:
  • OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于和。但是,也有一些函数对适用于资源数组,例如和。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是... 对于上述SSCCE g树

  • 问题内容: 我正在尝试在Java中执行以下操作: 但是代码无法编译,因为我不能用 T 代替 Class <?>。 在具体的课程中,我可以这样称呼 bar : 但是对于 T而言 ,这是行不通的。即没有 T.class 这样的东西 __ 在C#中, typeof 适用于具体类型和模板类型。因此,对bar的调用将是: 但是我无法在Java中找到任何类似的东西。 我是否缺少某些东西,或者Java是否无法获

  • 我正在为一个系统建模,该系统有一个创建资源的操作和其他消耗该资源的操作。然而,一个给定的资源只能被消耗一次——有没有一种方法可以保证在编译时这样做? 具体来说,假设第一个操作烘焙蛋糕,还有另外两个操作,一个用于“选择吃”蛋糕,另一个用于“选择吃蛋糕”,我只能做其中一个。 通过在我们使用蛋糕后在蛋糕上设置一个标志,很容易在运行时强制执行不保留已经吃过的蛋糕(反之亦然)的限制。但是有没有办法在编译时强

  • 问题内容: 我有一个方法返回基类的集合: 由于()的返回类型与方法()的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。 有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。 当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用

  • 问题内容: 说我有3个这样的课程: 难道那么有可能确定一个特定的对象是否是他的一个实例,或? 我认为这样的事情可能会起作用: 但是经过一点阅读之后,我认为它始终会被评为B,因为它只是测试强制转换是否有效,并且两者之间没有实质性差异。 问题答案: 做这个: