在这种情况下,是否有类似于C++03的constexpr的内容

Is there anything similar to constexpr for C++03 in this context?

本文关键字:constexpr C++03 类似于 这种情况下 是否      更新时间:2023-10-16

假设我有一个带有整数模板参数的模板类A和一个从A的专门化派生的类B(可能有许多这样的派生类具有A的不同专门化(。我希望能够询问B它的基类有什么模板参数,并从基类中调用相应的静态函数。

这对C++11constexpr关键字来说很简单,但这样的关键字在C++03中并不存在。因此,此代码无法使用C++11编译器在C++03-(假定(兼容行上进行编译

template<int N>
struct A
{
    static const int getN() { return N; }
    static constexpr int getNc() { return N; }
    static int g(const A& a) { return 123; }
};
struct B : public A<4>
{   
};
int main()
{
    A<B::getNc()>::g(B()); // OK in C++11
    A<B::getN()>::g(B()); // FAIL in any C++ version
}

所以,问题是,我如何在C++03中实现同样的目标?也许有一些语法糖可以避免在main()中显式指定A的模板参数?

在C++03中,常量表达式可以是静态常量变量

static const int value = N;

或枚举器

enum {value = N};

其中任何一个都可以作为访问

A<B::value>::g(B());

也许有一些语法糖可以避免显式指定的模板参数

你可以提供一个非会员帮助功能:

template <class DerivedFromA>
int g(const DerivedFromA & a) {
    return A<DerivedFromA::value>::g(a);
}
// usage
g(B()); // equivalent to A<B::value>::g(B());

使用static const数据成员而不是函数:在A中,放置

static const int NVal = N;

然后CCD_ 11会将CCD_ 12模板参数的值作为编译时间常数。