2

関数に渡されたコンパイル時の定数整数をテンプレート化された型にキャプチャしたいと思います。将来の目標は、-2*i + 3*k のような非常に単純な式 (コンパイル時定数 int と変数の合計) から式を作成する独自の (非常に限定された) 式テンプレートを作成することです。

私は非常にゆっくりと始めています。次のコードがあります。

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 パラメータのようなものはないことを読みました。

私が望むものを達成する方法はありますか?

4

1 に答える 1

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!");
}
于 2013-01-23T16:26:25.723 に答える