我正在学习 C++ 中的反射,并遇到了 boost::pfr 库。 我想知道 - 是否可以从元组中设置每个结构字段?我尝试了这种方法,但出现错误:
no matching function for call to 'get'
。我可能会错过什么?
看这个例子: https://godbolt.org/z/4bhGzcKdv
struct MyStruct
{
int i_{};
bool b_{};
std::string s_;
};
MyStruct makeStructFromTuple(auto& tuple)
{
MyStruct s;
boost::pfr::for_each_field(s, [&](auto& field, std::size_t index){
// error is here
field = boost::pfr::get<index>(tuple);
// field = std::get<index>(tuple);
});
return s;
}
int main()
{
std::tuple<int, bool, std::string> tuple = std::make_tuple(1, true, "str");
auto s = makeStructFromTuple(tuple);
std::cout << "MyStruct: " << s.i_ << s.b_ << s.s_;
}
您不能使用运行时变量索引作为编译时参数来获取。所以你的最小可重现的例子是这样的
#include <tuple>
int main()
{
std::size_t index{1ul};
std::tuple<int,int,int> t{1,2,3};
auto value = t.get<index>(); // index is a runtime variable and cannot be used as template argument
}
编译器将给出完全相同的错误:请参阅https://godbolt.org/z/7TWT7nc5b