integral_constant和模板参数推导

integral_constant and template argument deduction

本文关键字:参数 constant integral      更新时间:2023-10-16

我想将传递给函数的编译时常量整数捕获到模板化类型中。未来的目标是推出我自己的(非常有限的)表达式模板,该模板从非常简单的表达式(编译时常量 int 和 in 变量的总和)创建表达式,例如:-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 参数这样的东西。

有没有办法完成我想要的?

您可以在没有模板的情况下执行此操作。这个答案或多或少地将@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!");
}