我正在开发一种某种元组结构,我想允许用户将其元素用作字段,
解释:
这是我的元组:
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);
};