c – 命名元组元素

我正在开发一种某种元组结构,我想允许用户将其元素用作字段,

解释:

这是我的元组:

template<typename ...Ts>
struct myTuple{
   std::tuple<Ts...> data;

   template<size_t I>
   inline type<I>& get_t() {   // type<I> is the I'th type
      return std::get<I>(data);
   }

   // Other stuff
};

目前,用户可以这样使用:

struct UserStruct{
   myTuple<int,bool,string> t;
   // Other stuff
}

并使用它,像

UserStruct ob;
ob.t.get_t<0>() = 0;

这有点复杂……所以我这样做了

struct UserStruct{
   myTuple<int,bool,string> t;

   decltype(mo.get_t<0>()) myInt() {
      return mo.get_t<0>();
   }

   decltype(t.get_t<1>()) myChar() {
      return t.get_t<1>();
   }

   decltype(t.get_t<2>()) myString() {
      return t.get_t<2>();
   }
};

所以他可以直接使用它:myInt()= 0;

我的目标是他可以使用元组,好像他有一个int,bool,字符串数据成员而不存储引用,这意味着我需要一个函数(或函子)来获取引用,所以我的解决方案很好,但它需要用户定义功能. (并且实际代码中的getter看起来更糟)

所以我想要这样的事情:

struct UserStruct{
   myTuple<int,bool,string> t;

   MyFunctor<0> myInt;   //or an alias to a function

   MyFunctor<1> myChar;

   MyFunctor<2> myString;
};

最佳答案 代码如MyFunctor< 0>敏;如果没有向仿函数提供t也无法工作,因此它知道链接到哪个元组.但是,您可以添加一个宏来为您构建访问器,它将假定元组名称为t(或者您将其提供给宏).

#define LINK_MEMBER(ID, NAME) decltype(t.get_t<ID>()) NAME() {  \
  return t.get_t<ID>();                                         \
}

然后你的代码看起来像

struct UserStruct{
   myTuple<int,bool,string> t;
   LINK_MEMBER(0, myInt);   //or an alias to a function
   LINK_MEMBER(1, myChar);
   LINK_MEMBER(2, myString);
};
点赞