派生类能否特化父类模板成员函数?嵌套数值类型实现咨询
实现嵌套数值类型并解决模板特化问题
我想要实现一种嵌套数值类型,用于适配类似[1, [2, 3], [[4, 5], 6, [7, [8]]]]的嵌套列表,同时实现get函数来访问元素:理想情况下,get<int>可访问单个数字,get<std::vector<NestedNum>>可获取列表。
最初的代码框架及问题
最初尝试通过继承实现,但遇到了模板特化的错误:
template <typename T> class NestedNumItem { public: NestedNumItem() {} NestedNumItem(T v): val(v) {} template <typename S> S get() { return val; } private: T val; }; template <typename T> class NestedNum: public NestedNumItem<T> { public: NestedNum() {} NestedNum(T v): NestedNumItem<T>(v) {} // 引用基类中定义的模板函数 using NestedNumItem<T>::get; // 错误:无匹配的函数模板特化'get' template <> std::vector<NestedNum> get() { return vec; } void push_back(NestedNum &num) { vec.push_back(num); } NestedNum& operator[] (size_t i) { return vec[i]; } private: std::vector<NestedNum> vec; };
派生类无法识别父类的模板成员函数,报错提示无匹配的函数模板特化'get'。
完善后的实现方案
经过多次尝试,我写出了一个使用更复杂模板的完善版本,借助template template parameter可以为不同场景指定所需容器:
template <typename T, template<typename, typename...> class Container, typename... Rest> class Nested { public: Nested() { data = Container<Rest..., Nested>(); } Nested(T a) { data = a; } // 嵌套容器类型 using NestedCon = Container<Rest..., Nested>; // 嵌套容器引用 using NestedConRef = Container<Rest..., Nested>&; // get()函数模板 template <typename S> S get(); template<> T get() { return std::get<T>(data); } template<> NestedConRef get() { return std::get<NestedCon>(data); } private: std::variant<T, Container<Rest..., Nested>> data; };
测试示例
以下是两个测试用例,分别验证了vector和unordered_map作为嵌套容器的场景:
TEST(TestNested, test_init_vec) { using NestedInt = Nested<int, std::vector>; NestedInt nv; NestedInt a(100); nv.get<NestedInt::NestedConRef>().push_back(a); cout << nv.get<NestedInt::NestedConRef>()[0].get<int>() << "\n"; } TEST(TestNested, test_init_umap) { using NestedUmap = Nested<int, std::unordered_map, std::string>; NestedUmap num; NestedUmap a(101); num.get<NestedUmap::NestedConRef>()["ab"] = a; cout << num.get<NestedUmap::NestedConRef>()["ab"].get<int>() << "\n"; }
输出结果
输出符合预期:
100 101
说明:
可进一步简化get赋值语法,但为演示目的,暂保留当前形式:)
内容的提问来源于stack exchange,提问作者oronr
相关产品推荐
相关产品推荐

