类似于std::tuple
template<typename... Args> class MyTuple;
template<> class MyTuple<>{}; // 终止递归的空类
template<typename Ty, typename... Args> class MyTuple<Ty, Args...> : MyTuple<Args...> { //私有继承
public:
MyTuple(const Ty& _1, const Args&... args) :MyTuple<Args...>(args...), data(_1) {
}
Ty GetData()const { return data; }
MyTuple<Args...> GetTill() const { return *this; }
private:
Ty data;
};
构造函数不断的向上构造,直到没有参数,调用空类结束构造。GetTill将会将当前的对象转化为基类的对象从而访问上一层的数据。
然后添加一个推到指引便可以使用了
template<typename Ty,typename... Args>
MyTuple(Ty, Args...)->MyTuple<Ty, Args...>;
int main() {
MyTuple tup(12, 34.4, "helllo");
}
为了便于访问每一层的数据,我编写了一个类似接口的函数:
template<size_t N,typename... Types>
auto Get(const MyTuple<Types...>& obj) {
if constexpr (N == 1)
return obj.GetData();
else
return Get<N - 1>(obj.GetTill());
}
这样我就可以按照顺序进行读取指定层面的数据了。