3

私は struct を持っていFooます。Fooさまざまなオブジェクトに渡された値のタプルから静的に選択するために、ある種の ID (プレースホルダー ?) を追加したいと思います。理想的には、他の場所で多くの変更をトリガーするため、テンプレート タイプにはしません。

整数を追加して constexpr 式を使用してみました (デモ)

#include <tuple>

using namespace std;

struct Foo {
private:
  const int pl;

public:
  constexpr Foo (int c) : pl(c) {}

  constexpr int place() {return pl;}

  template <typename... T>
  constexpr int extract(std::tuple<T ...> const &vals) {
    // I would like to uncomment the following but it fails compiling
    // return std::get<pl>(vals);
    return std::get<0>(vals);
  }
};

int main(void) {
   constexpr Foo f(1);
   constexpr std::tuple<int, int> test = std::make_tuple(0, 10);

   // The following passes
   static_assert(f.place() == 1, "ERROR");
   // The following fails
   static_assert(f.extract(test) == 10, "ERROR");
}

で を使用できると思っていconstexpr place()ましたがget<>、何が欠けていますか?

テンプレートを使わない方法はありますか?

4

1 に答える 1

1

最初のブロッカーは、std::getがそうではないということです。constexprしたがって、うまくstd::get<0>いくとしても、そうする必要はありません。(@Nate Kohlへのクレジット)

頑張ってアクセサーを使って自分tupleで書くこともできますconstexprが、この方法も失敗します。また、すべての関数は、引数 (または constexpr this)なしで呼び出すことができる必要があります。現在、constexpr をオーバーロードする方法はありません。constexprconstexpr

だから、運が悪い。これは C++11 では不可能です。

于 2013-01-24T22:52:34.513 に答える