【问题标题】:integral_constant and template argument deduction积分常数和模板参数推导
【发布时间】: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。不完全相同...
  • 哦,是的,我完全没有注意到2int 不能以任何方式转换为integral_constant&lt;int,2&gt;,无论模板推导如何。

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


【解决方案1】:

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

【讨论】:

  • stacked-crooked.com/view?id=90398ee0c8dd684a0cf53f6fb34dbe7e 哦,嘿,integral_constant&lt;int, 2&gt; 隐式转换为int?我不知道!那是新的吗?这段代码似乎很好。
  • @MooingDuck:它在 C++ 标准的第 20.9.3 节中指定。 integral_constant&lt;&gt; 有一个 constexpr 到基础类型的转换运算符(是的,该运算符未标记为 explicit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2018-08-26
  • 1970-01-01
相关资源
最近更新 更多