我有一个结构Foo
。
我想添加一些id(占位符?)来静态选择传递给不同Foo
对象的值元组。
理想情况下,我不会将其设为模板类型,因为它会在其他位置触发许多更改。
I tried adding an integer to it and use constexpr expressions (Demo)
#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<>
,我错过了什么?
我是否可以在不使用模板的情况下解决问题?
答案 0 :(得分:1)
第一个拦截器是std::get不是constexpr
,所以即使std::get<0>
适合您,也不一定。 (感谢@Nate Kohl)
您可以尝试使用tuple
访问者编写自己的constexpr
,但这种方法也会失败。 每个函数constexpr
也必须可以在没有constexpr
参数(或constexpr this)的情况下调用。目前没有办法在constexpr上重载。
所以,运气不好。这在C ++ 11中是不可能的。