2013-07-25 78 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