3

我有一个结构Foo。我想添加某种 id(占位符?)以从传递给不同Foo对象的值元组中静态选择。理想情况下,我不会将其设为模板类型,因为它会触发其他位置的许多更改。

我尝试向它添加一个整数并使用 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()in get<>,我错过了什么?

不使用模板我有出路吗?

4

1 回答 1

1

第一个障碍是std::get is not constexpr,因此即使std::get<0>对您有用,也不必这样做。(归功于@Nate Kohl)

tuple您可以尝试使用访问器编写自己的constexpr方法,但这种方法也会失败。每个函数constexpr必须可以在没有constexpr参数的情况下调用(或 constexpr this)。目前没有办法在 constexpr 上重载。

所以,倒霉。这在 C++11 中是不可能的。

于 2013-01-24T22:52:34.513 回答