我想将传递给函数的编译时常量整数捕获到模板化类型中。未来的目标是滚动我自己的(非常有限的)表达式模板,该模板从非常简单的表达式(编译时常量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参数。
有没有办法实现我想要的目标?
答案 0 :(得分:3)
你可以在没有模板的情况下做到这一点这个答案或多或少地将@ MooingDuck的建议扩展为具体代码,您可能会发现这些代码更容易理解:
#include <type_traits>
using namespace std;
struct Foo {
constexpr Foo (int i) : i_(i) {}
int i_;
};
constexpr int operator*(int i, Foo j) {
return i * j.i_;
}
int main(void) {
integral_constant<int, 2> k;
constexpr int i = k * Foo(3);
static_assert(i == 6, "Error!");
constexpr int j = 2 * Foo(3);
static_assert(j == 6, "Error!");
}