简短版本:
我希望能够将一个结构体转换为元组。至少是类型。在下面的代码中,convertToTuple 函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键行是:* 自动& [值...] =值;*
struct Vec3 {
float x;
float y;
float z;
};
template <typename T>
auto structToTuple(T &value) {
auto& [values...] = value; //doesn't work
return std::make_tuple<decltype(values)...>(values...);
}
Vec3 v;
std::tuple<float, float, float> t = structToTuple(v);
基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含来自结构的所有类型。
struct Ray {Vec3, Vec3} -> std::tuple<
std::tuple<float, float, float>,
std::tuple<float, float, float>>;
详细问题:
我想创建一个模板函数,它以一个类型或类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理列表进行采样,并将这些值打包在一起以返回相同的类型。例如,如果我有一个类型:
std::pair<std::tuple<int, int>, int> value;
std::tuple<Texture<int, int>, Texture<int>> tex = createTexture(value);
std::pair<std::tuple<int, int>, int> thisshouldwork = sample(tex);
上面的代码只是我想做的一个简单的例子,而不是我的实际代码。在这种情况下,将创建2个纹理,一个纹理将包含来自元组的两个int类型,另一个将包含单个int类型。我的意图是将纹理处理隐藏在一个接口后面,我可以在纹理中存储任意值(只要它是由一些简单类型组成的),然后上传到GPU用于着色器。只要我只使用std::tuple和std::pair,它就可以工作,因为我可以从中提取类型:
template <typename... Args>
void f(std::tuple<Args...> t);
我希望在模板参数是自定义结构时也能这样做。例如:
struct Vec3 {
float x;
float y;
float z;
};
Vec3 v;
Texture<float, float, float> tex = createTexture(v);
struct Ray{
Vec3 pos;
Vec3 dir;
};
Ray r;
std::tuple<Texture<float,float,float>, Texture<float,float,float>> tex2 = createTexture(r);
我不相信这在当前的C++标准中是可能的,但是基于结构化绑定,这似乎是可能的。我的想法是这样的:
template <typename T>
auto structToTuple(T &value) {
auto& [values...] = value;
return std::make_tuple<decltype(values)...>(values...);
}
Vec3 v;
std::tuple<float, float, float> t = structToTuple(v);
就我所知,可变参数只适用于函数或模板参数,但如果 structToTuple 函数可以工作,就可以解决我的问题。
提前感谢你们的帮助,伙计们!
更新日期:
我已经找到了解决问题的方法(不是通用解决方案):https://github.com/Dwarfobserver/AggregatesToTuples/blob/master/single_include/aggregates_to_tuples.hpp
这个库的作者定义了一个结构到元组的转换,但是它只在结构的参数不超过50个的情况下有效。这在实践中解决了我的问题,尽管我仍然很好奇它是否可以在任意的结构中实现。
2条答案
按热度按时间ijnw1ujt1#
你忽略了结构化绑定的设计目的,即作为一名程序员,它是一种“解包”函数返回的多个参数的方法,这种方法可以使单个参数的寻址变得容易。参数的数量在任何时候都是未知的或可变的。
https://en.cppreference.com/w/cpp/language/structured_binding
正如在上面的评论中提到的,有一个Reflection TS正在开发中(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4746.pdf),但它最多只能提供工具来创建一个满足您需求的解决方案,而不是一个开箱即用的解决方案。我的理解是Reflection TS涵盖了静态反射,在静态反射中您可以推导出类型的形状和内容,而不是动态反射,在动态反射中您可以动态创建类型。
1zmg4dgp2#
我认为
zpp::bits
库所做的事情与OP提出的解决他/她的问题的方案类似,我已经提到了answer to another SO question中的类似解决方案。