use*_*020 3 c++ templates tuples c++11
例如,我有一个像元组
std::tuple<T0, T1, T2> tp;
Run Code Online (Sandbox Code Playgroud)
我可以按std::get()功能获得它的元素
auto e0 = std::get<0>(tp);
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用有意义的索引来访问除数字之外的元素.一种方法是定义类似的枚举
enum MyEnum
{
WHAT_T0_MEANS = 0,
WHAT_T1_MEANS = 1,
WHAT_T2_MEANS = 2
};
Run Code Online (Sandbox Code Playgroud)
因此,我可以使用友好版本的喜欢
auto e0 = std::get<WHAT_T0_MEANS>(tp);
Run Code Online (Sandbox Code Playgroud)
问题是,有时我发现元组中的类型顺序不友好,并将其更改为喜欢std::tuple<T1, T0, T2>.但是很容易忘记改变枚举中元素的顺序.一个好方法可能是定义T0在类T0中的含义,或者使用map来查找T0的含义,否则.然后编写一些函数来通过T0的含义来获取元素.有办法吗?这里,枚举元素不需要T0的含义.它可以是一种类型或其他任何东西.
如果T0,T1和T2是不同的类型.功能就像
T MyGet<T>(tp)
Run Code Online (Sandbox Code Playgroud)
T可以是T0,T1或T2,没关系.
正在进行讨论:
现在,您可以使用像Fusion Map这样的标记元素:
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/at_key.hpp>
using namespace boost::fusion;
typedef map<
pair<struct what_t1_means, int>
, pair<struct what_t2_means, int> >
map_type;
int main()
{
map_type m { 42, -42 };
auto i1 = at_key<what_t1_means>(m);
auto i2 = at_key<what_t2_means>(m);
}
Run Code Online (Sandbox Code Playgroud)
我选择使用int两次,以突出显示'key types'与'tuple'类型分开.
请访问http://liveworkspace.org/code/4CxV4T$0直播
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |