如何拼接两个基于std::tuple的C++类模板对象?
解决基于std::tuple的类模板拼接问题
你的问题核心是foo类私有继承了std::tuple,无法直接将foo对象传入std::tuple_cat,因为foo本身不是std::tuple类型。下面是两种可行的实现方案:
方案一:通过友元权限访问底层tuple
修改foo类,将operator+声明为友元,这样它可以直接把foo对象转换为基类std::tuple的引用:
#include <tuple> #include <utility> // 用于std::make_from_tuple template<typename...Ts> class foo : private std::tuple<Ts...> { public: foo(Ts...vs) : std::tuple<Ts...>(vs...){} // 声明operator+为友元,允许它访问私有继承的基类 template<typename...T1s, typename...T2s> friend foo<T1s..., T2s...> operator+(const foo<T1s...>& foo1, const foo<T2s...>& foo2); }; template<typename...T1s, typename...T2s> foo<T1s..., T2s...> operator+(const foo<T1s...>& foo1, const foo<T2s...>& foo2){ // 将foo对象转换为对应的std::tuple引用 auto combined_tuple = std::tuple_cat( static_cast<const std::tuple<T1s...>&>(foo1), static_cast<const std::tuple<T2s...>&>(foo2) ); // 用拼接后的tuple构造新的foo对象 return std::make_from_tuple<foo<T1s..., T2s...>>(combined_tuple); } // 测试代码 int main() { foo<int, float, const char*> obj1(1, 1.23, "string1"); foo<const char*, float, int> obj2("string2" , 1.23, 1); foo<int, float, const char*, const char*, float, int> obj3 = obj1 + obj2; return 0; }
方案二:提供公共接口暴露底层tuple
如果不想用友元,可以给foo类添加一个公共成员函数,返回底层std::tuple的引用:
#include <tuple> #include <utility> template<typename...Ts> class foo : private std::tuple<Ts...> { public: foo(Ts...vs) : std::tuple<Ts...>(vs...){} // 公共接口,返回底层tuple的const引用 const std::tuple<Ts...>& get_tuple() const { return *this; // 私有继承下,成员函数可直接访问基类实例 } }; template<typename...T1s, typename...T2s> foo<T1s..., T2s...> operator+(const foo<T1s...>& foo1, const foo<T2s...>& foo2){ // 通过公共接口获取tuple后拼接 auto combined_tuple = std::tuple_cat(foo1.get_tuple(), foo2.get_tuple()); return std::make_from_tuple<foo<T1s..., T2s...>>(combined_tuple); } // 测试代码 int main() { foo<int, float, const char*> obj1(1, 1.23, "string1"); foo<const char*, float, int> obj2("string2" , 1.23, 1); foo<int, float, const char*, const char*, float, int> obj3 = obj1 + obj2; return 0; }
关键说明
std::tuple_cat只能接受std::tuple类型的参数,因此必须先从foo对象中提取出底层的std::tuple实例。std::make_from_tuple是C++17引入的工具,可以直接用tuple中的元素构造任意类型的对象,避免了手动展开tuple参数的麻烦。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

