【发布时间】:2016-05-25 14:37:01
【问题描述】:
目前我正在重写/扩展我的 C++ 实用程序库,并考虑到新的 C++11 功能。其中一个新增功能是一个模板类,它给出了一组数字的最大值,希望在编译时。
template<typename T, T... Xs> class ConstMax
{
private:
template<typename... Ts> static constexpr T Max(Ts... xs);
template<typename Tx> static constexpr T Max(Tx x)
{
return x;
}
template<typename T1, typename T2, typename... Ts> static constexpr T Max(T1 x, T2 y, Ts... xs)
{
return y > x ? Max<T2, Ts...>(y, xs...) : Max<T1, Ts...>(x, xs...);
}
public:
static const T Value = Max(Xs...);
};
这个类的一个示例使用:
int max = ConstMax<int, 1, 8, 66, 32, 90, 12, 33>::Value;
这里是另一个例子,它可能使验证 ConstMax<...>::Value 是否在编译时实际被评估变得更加困难:
template<typename... Ts> class Variant
{
public:
static const size_t MaxValueSize = ConstMax<size_t, sizeof(Ts)...>::Value;
};
这导致max = 90。我使用 gdb 遍历了这段代码,似乎在分配 max 期间没有执行任何函数调用。
我的问题:
- 我可以安全地假设
ConstMax<...>::Value在编译时总是已知的吗? - 有没有办法检查
constexpr函数/方法是否在编译时被评估? - 我了解定义为
constexpr的成员/方法/函数不一定在编译时进行评估,Value被定义为static const的事实是否会对此有所改变,或者我是否最好执行此特定情况作为递归模板类?
【问题讨论】: