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 中实现同样的效果?也许有一些语法糖可以避免A在main()这里显式指定模板参数?
在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)