2013-07-25 55 views
2

在最新的模板约束文件中,介绍了一个约束模板参数的新工具集。另外,在C++中提供了14个可变模板。变量模板允许定义类型参数化常量等等。模板约束是否可用于变量模板?

没有提及这些功能如何交互。使用pi的规范示例,我们可以这样做:

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

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

这将强制将C/C++数值从整数转换为double。它也会阻止用完全不相关的类型进行实例化。 (看着这个,我们可能想用一些需要浮点数的浮点数代替Floating_point来支持复数。)

我错过了其中一篇论文的东西,或者这是在作品中?也许它是免费的,不值得一提?

+0

重新标记[标签:C++ 1Y]按照[该元讨论](HTTP://元.stackexchange.com /问题/ 177625/C14-或-C1Y)。 – Casey

+0

在第一个例子中,您不使用'Integral'模板类型,并且'double'也不是整数。看起来你正在试图专注于一个'constexpr'模板。那是你要的吗?这与约束有什么关系?你的意思是? Concepts Lite使用C++ 14,但这与您的示例无关。 – cdmh

+0

我正在尝试专门化整数类型的变量模板以提升为double(这是库中的数学函数)。也许我搞砸了语法。我希望Integral派遣到这个专业 - 不要使用它。 – emsr

回答

2

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

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 

- 端示例]

+0

@emsr目前的答案是可接受的,还是我需要解决一些问题? – TemplateRex