【发布时间】:2013-01-23 16:09:58
【问题描述】:
我想将传递给函数的编译时常量整数捕获为模板类型。未来的目标是推出我自己的(非常有限的)表达式模板,它从非常简单的表达式(编译时间常量 int 和变量的总和)创建表达式,例如:-2*i + 3*k。
我开始很慢,我有以下代码:
struct Foo {
Foo (int i) : i_(i) {}
int i_;
};
template <int N> int operator*(std::integral_constant<int, N> i, Foo j) {
return N * j.i_;
}
int main(void) {
std::integral_constant<int, 2> k;
int i = k * Foo(3);
cout << i << endl;
int j = 2 * Foo(3);
cout << j << endl;
}
2*Foo(3) 的模板参数推导失败。 我读过,函数没有 constexpr 参数。
有没有办法实现我想要的?
【问题讨论】:
-
使运算符、构造函数和结果为“constexpr”。
-
感谢您的回复,不幸的是,我无法使其正常工作:我对 j、运算符和 Foo 构造函数的定义进行了 constexpr'ed,但对于 gcc-,我仍然得到相同的模板推导错误- 4.6 和铿锵++。您介意发布一个可以编译的修改版本吗?另外,一般来说,Foo 可能不是 constexpr,而是我表达中更一般的术语。
-
我怀疑你可以把 2 变成一个integral_constant
。你必须至少写 I(2) 或类似的东西,其中 I 是一个宏。人们在表达式模板中所做的是有一个类型 int_cst 和一个成员 int 他们存储数字 2。不完全相同... -
哦,是的,我完全没有注意到
2。int不能以任何方式转换为integral_constant<int,2>,无论模板推导如何。
标签: c++ templates c++11 constexpr clang++