Variable Template in C++14
C++14 introduced new type of templates which are variable templates1. What it means is that it’s now possible to create template of a variable like this:
1 2 3 4 | template<class Type> constexpr Type PI = (Type)3.1415; auto v = PI<double>; |
This introduces a variable that can take different values for different template parameter. Main gain comes when such value is specialized like template:
1 2 3 4 | template<> constexpr int PI = 4; // Because I can auto v = PI<int>; |
Of course in previous versions of standard this could be done in a slightly different way by using functions like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 | template<class Type> constexpr Type PI() { return (Type)3.1415; } template<> constexpr int PI() { return 4; // Because I can } auto v = PI<double>(); |
The difference in usage is “()” which is used in a function call when using function template version. But there is also another difference which makes variable template unfortunately less useful than function template. Since C++11 it is possible to delete a specialization of function template but it seems it’s not possible to delete specialization of variable template:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | template<class Type> constexpr Type PI() { return (Type)3.1415; } template<> constexpr int PI() = delete; template<class Type> constexpr Type ANSWER = (Type)42; //template<> //constexpr double ANSWER<double> = delete; // not possible |
But of course no one says that we cannot use both as a syntactic sugar:
1 2 | template<class Type> constexpr Type PI_VAR = PI<Type>(); |