c++ - integral_constant 和模板参数推导

标签 c++ templates c++11 constexpr clang++

我想将传递给函数的编译时常量整数捕获为模板化类型。 future 的目标是推出我自己的(非常有限的)表达式模板,该模板从非常简单的表达式(编译时常量 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!");
}

关于c++ - integral_constant 和模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484089/

相关文章:

c++ - 访问 std::vector 容器内的数据

Android N libusb_init 返回-1 未能初始化libusb

c++ - 不允许复制构造函数但允许从其他类型隐式复制

c++ - 尝试写入二进制文件时出现垃圾

c++ - 这个简单的 pthread 代码的奇怪行为

c++ - 开关语句和整数模板值

C++ - shared_ptr 出现 "Unspecialised class template"错误

c++ - 具有不同返回类型的成员函数的模板化别名

c++ - clang 不喜欢 boost::signals2?

c++ - 关于命令行参数/char* 的三个问题