You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

派生类能否特化父类模板成员函数?嵌套数值类型实现咨询

实现嵌套数值类型并解决模板特化问题

我想要实现一种嵌套数值类型,用于适配类似[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:15:03