具有不同类型的模板非类型参数

MTMD

假设输入模板参数T可能具有也可能没有内部变量bar我正在尝试编写一个结构,bar当我们拥有它时返回它的值,而当我们没有它时返回一个常数。这是我的尝试:

struct A {
  static constexpr unsgined int bar = 20;
  hasBar = true;
};

struct B {
  hasBar = false;
};

template <typename T, typename std::enable_if<T::hasBar, int>::type>
struct getBar {
  static constexpr unsigned int bar = T::bar;
};

template <typename T, typename std::enable_if<!T::hasBar, int>::type>
struct getBar {
  static constexpr unsigned int bar = 0;
};

int main() {
  getBar<A>::bar; // Expect 20
  getBar<B>::bar; //Expect 0
}

我无法使用C ++ 14编译此代码。编译器抱怨:“模板非类型参数具有不同的类型”。

为什么我们会有这样的错误,我该如何解决?

songyuanyao

类模板不能重载(如函数模板);您可以改用专业化例如

template <typename T, typename = void>
struct getBar {
  static constexpr unsigned int bar = 0;
};

template <typename T>
struct getBar<T, std::enable_if_t<T::hasBar>> {
  static constexpr unsigned int bar = T::bar;
};

生活

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有模板非类型模板参数的功能模板

非类型模板参数不能具有类型

返回具有不同模板参数值的不同类型(但类型相同)

具有非类型模板参数的C ++ 20 lambda

具有条件的C ++模板非类型参数

具有非类型模板参数的构造函数

具有两个不同类型参数的隐式模板类型推导

具有混合类型参数和非类型可变参数的模板模板参数

是否可以保证对非类型模板参数的专业化具有唯一的不同成员指针的参数?

C ++模板可返回具有相同参数的不同类型

是否可以构建具有不同类型的可变参数模板?

如何创建可以处理具有不同类型参数的std :: set的模板类

从类到具有不同模板类型的相同类的转换

具有用户定义类型的自动非类型模板参数

具有不同类型的可变参数的宏

具有不同类型的多个参数的Dapper更新查询

使用类属性调用具有非类型模板参数的模板函数

具有非类型模板参数的功能模板中的static_assert

没有constexpr的模板非类型参数的类型转换

模板非类型参数推导

非类型模板参数

具有非类型参数的部分模板专业化:GCC与MSVS

未定义引用`operator <<(std :: ostream&,/ *具有非类型模板参数的类* /&)'

具有非类型参数包的模糊类模板实例化

具有非类型参数的 C++ 模板类:如何重载赋值运算符?

具有任何非类型参数的C ++模板专业化

包装非类型模板常量以避免混合相同类型的参数

从非类型模板参数确定类型

推断非类型模板参数的类型