在这种情况下,是否有类似于C++03的constexpr的内容
Is there anything similar to constexpr for C++03 in this context?
假设我有一个带有整数模板参数的模板类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模板参数的值作为编译时间常数。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 在这种情况下,是否有类似于C++03的constexpr的内容