使用有意义的单词来获取元组元素

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,没关系.

seh*_*ehe 6

正在进行讨论:

现在,您可以使用像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直播