在这种情况下,是否有类似于 C++03 的 constexpr 的东西?

Rus*_*lan 2 c++ templates constants

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

使用 C++11 关键字很容易做到这一点constexpr,但 C++03 中不存在这样的关键字。因此,此代码无法在 C++03(据称)兼容行上使用 C++11 编译器进行编译:

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
}
Run Code Online (Sandbox Code Playgroud)

那么,问题是,如何在 C++03 中实现同样的效果?也许有一些语法糖可以避免Amain()这里显式指定模板参数?

Mik*_*our 5

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

static const int value = N;
Run Code Online (Sandbox Code Playgroud)

或枚举器

enum {value = N};
Run Code Online (Sandbox Code Playgroud)

您可以访问其中任何一个

A<B::value>::g(B());
Run Code Online (Sandbox Code Playgroud)

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

您可以提供非成员帮助函数:

template <class DerivedFromA>
int g(const DerivedFromA & a) {
    return A<DerivedFromA::value>::g(a);
}

// usage
g(B()); // equivalent to A<B::value>::g(B());
Run Code Online (Sandbox Code Playgroud)