【问题标题】:Using constexpr in a type dependent context在依赖类型的上下文中使用 constexpr
【发布时间】:2018-01-10 20:22:41
【问题描述】:

简单的问题,这合法吗?

template<class T>
struct foo {

using type = std::conditional<IF_CONDITION<T>::value, constexpr int, int>::type;

};

编译器错误:“错误:“constexpr”在此处无效” 无法找到有关此的任何文档。因为它是一个编译时条件,所以这似乎至少在理论上应该能够做到。

【问题讨论】:

  • constexpr int 不是类型
  • "const int" 将是一种类型。 "constexpr int" 不是类型。
  • 我明白了,我认为它可以与const 媲美你知道他们是否有任何方法可以效仿吗? (类专业化除外)
  • @JosephFranciscus 在什么样的代码中你需要有条件的 constexpr?也许我们可以帮助你。
  • 我正在写一个像Eigen 这样的库,所以如果Rows == 0 比我想要一个动态的Row 值(IE 常规int),一个对象会像Vector&lt;class T, int Rows&gt;,否则我想要它是constexpr(在编译时会知道)

标签: c++ templates metaprogramming


【解决方案1】:

来自标准:

constexpr 说明符仅适用于定义 变量或变量模板或 函数或函数模板的声明。使用 constexpr 声明的函数或静态数据成员 说明符隐式是内联函数或变量 (10.1.6)。如果函数或函数的任何声明 模板有一个 constexpr 说明符,那么它的所有声明都应包含 constexpr 说明符。 [ 笔记: 关于 constexpr 说明符,显式特化可以不同于模板声明。 — end note ] [ 注意:函数参数不能声明为 constexpr。 ——尾注]

所以 constexpr 不应该在模板参数中。

在您的情况下,您可以使用以下命令创建类型专业化别名:

template<typename T>
using MyVec0 = Vector<T,0>;

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 2021-12-30
    • 2021-05-29
    • 2023-03-29
    • 2015-09-21
    • 2017-01-05
    • 1970-01-01
    • 2016-05-28
    • 2019-06-06
    相关资源
    最近更新 更多