变量模板

时间:2016-02-29 08:32:16

标签: c++ c++14 variable-templates

C ++ 14引入了变量模板(Variable templates)。

template<class T>
constexpr T pi = T(3.1415926535897932385);  // variable template

template<class T>
T circular_area(T r) // function template
{
    return pi<T> * r * r; // pi<T> is a variable template instantiation
}

在二进制内存占用和运行时速度方面,使用它的开销是多少?

2 个答案:

答案 0 :(得分:5)

如果以下内容之间存在任何差异,我肯定会将此报告为编译器制造商的错误:

template<class T>
constexpr T pi = T(3.1415926535897932385);  // variable template

template<class T>
T circular_area(T r) // function template
{
    return pi<T> * r * r; // pi<T> is a variable template instantiation
}

constexpr double pi = 3.1415926535897932385;

double circular_area(double r)
{
    return pi * r * r;
}

如果您将double替换为float,则同样如此。

通常,constexpr应直接在编译代码中评估相关常量。如果它不能那样做,那么编译器应该给出一个错误(因为它不是真的constexpr)。

答案 1 :(得分:0)

鉴于;

template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;

没有运行时差异,它们都是编译时常量。模板是一个编译时间的东西 - 因此,当比较喜欢(例如constexpr double piconstexpr T pi)时,它最终将是相同的 - 这是预期的。

与OP代码有何不同之处在于它的使用方式。

template<class T>
T circular_area_t(T r) // function template
{
    return pi<T> * r * r; // pi<T> is a variable template instantiation
}
// and
constexpr double circular_area_1(double r)
{
    return pi<double> * r * r;
}
double circular_area_2(double r)
{
    return pi<double> * r * r;
}

给定constexpr函数circular_area_1和模板函数circular_area_t,这两者都会导致结果的编译时间计算,从而导致二进制文件中的文字。非constexpr函数circular_area_2被编译为普通函数,并在运行时执行以确定结果。这在运行时有所不同。请参阅here for a code listing