【问题标题】:Will template constraints be available for variable templates?模板约束是否可用于变量模板?
【发布时间】:2013-07-25 18:15:45
【问题描述】:

在最新的模板约束论文中,提出了一个约束模板参数的新工具集。此外,在 C++14 中提供了变量模板。变量模板允许定义类型参数化常量等。

没有提及这些功能如何交互。使用 pi 的典型示例,我们可以得到:

template<Integral T>
  constexpr double pi(3.141592653589793238);

template<Floating_point T>
  constexpr T pi(3.1415926535897932384626433832795029L);

这将强制将 C/C++ 数值从整数转换为双精度。它还可以防止使用完全不相关的类型进行实例化。 (看看这个,我们可能想用需要浮点 ctor 的东西来替换 Floating_point 以支持复数。)

我是否遗漏了其中一篇论文中的某些内容,或者正在研究中?也许它是免费提供的,不值得一提?

【问题讨论】:

  • 根据this meta discussion重新标记c++1y
  • 在第一个示例中,您没有使用Integral 模板类型,而且double 也不是一个整体。看起来您正在尝试专门化 constexpr 模板。那是你要的吗?这与约束有何关系?你是说概念吗? Concepts Lite 在 C++14 中,但这与您的示例无关。
  • 我试图将变量模板专门用于整数类型以提升为双精度(这是库中的数学函数所做的)。也许我搞砸了语法。我希望 Integral 派往这个专业——而不是使用它。
  • @cdmh,Concepts Lite 不在 C++14 中
  • @JonathanWakely 真的吗?感谢您的澄清,我认为他们做到了。

标签: c++ c++14 type-constraints c++-concepts


【解决方案1】:

在最新版本的提案(N4040,日期为 2014 年 5 月)中,答案是

5 变量模板有以下限制:

— 模板必须不受约束

——声明的类型必须是 bool。

——声明必须有一个初始化器。

——初始化器应该是一个约束表达式。

[示例:

template<typename T>
concept bool D1 = has_x<T>::value; // OK

template<typename T>
concept bool D2 = 3 + 4;           // Error: initializer is not a constraint

template<Integral T>
concept bool D3 = has_x<T>::value; // Error: constrained concept definition

—结束示例]

【讨论】:

  • @emsr 这个答案的当前形式是否可以接受,还是我需要解决一些问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2021-09-04
  • 2016-10-03
  • 2017-03-05
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多