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

C++能否传入嵌套层级不同的std::initializer_list构造NestedInteger对象?

支持异构嵌套初始化列表的NestedInteger实现方案

核心问题说明

C++ 标准中std::initializer_list是同构容器,所有元素类型必须完全一致,你当前声明的单模板参数初始化列表构造函数,只能接收所有元素类型相同的列表,自然无法适配嵌套异构的初始化结构。

可行实现方案

利用C++列表初始化的递归重载决议特性,提供两类核心构造函数即可支持任意层级的嵌套初始化:

  • 单个整数值的构造函数:用来将初始化列表里的原子int值转换为NestedInteger实例
  • 元素为NestedInteger类型的初始化列表构造函数:用来将每一层嵌套的{}结构转换为NestedInteger列表实例

C++17及以上版本可以配合std::variant实现存储,代码示例如下:

#include <initializer_list>
#include <variant>
#include <vector>

class NestedInteger {
private:
    // 存储结构:要么是单个int,要么是NestedInteger的列表
    std::variant<int, std::vector<NestedInteger>> storage;

public:
    // 单int构造函数,支持列表中的原子值自动转换
    NestedInteger(int val) : storage(val) {}

    // 嵌套初始化列表构造函数,支持任意层级的{}结构
    NestedInteger(std::initializer_list<NestedInteger> list)
        : storage(std::vector<NestedInteger>(list.begin(), list.end())) {}

    // 工具方法示例,按需扩展
    bool isInteger() const {
        return storage.index() == 0;
    }

    int getInteger() const {
        return std::get<int>(storage);
    }

    const std::vector<NestedInteger>& getList() const {
        return std::get<std::vector<NestedInteger>>(storage);
    }
};

使用示例

完成上述声明后,你就可以直接使用嵌套结构初始化实例了:

int main() {
    // 任意层级的嵌套结构都可以直接支持
    NestedInteger obj = {1, {2, {3, 4}}, 5};
    return 0;
}

实现原理

编译器处理拷贝列表初始化(= {}形式)时,会递归对每一层子{}结构做重载决议:

  1. 最内层的{3,4}会优先匹配std::initializer_list<NestedInteger>构造函数,其中3、4自动调用单int构造函数转为NestedInteger实例
  2. 上一层的{2, {3,4}}同理,2转为NestedInteger,{3,4}已经是NestedInteger实例,因此整体匹配初始化列表构造函数
  3. 最外层的列表元素全部为NestedInteger类型,直接匹配构造函数即可

兼容说明

如果使用C++17以下版本,没有std::variant可以替换为「bool标记位 + 匿名union」或者多态继承结构实现存储,两类核心构造函数的设计逻辑不变。
如果需要避免int的隐式转换,可将单int构造函数声明为explicit,但初始化时需要显式写出NestedInteger(1)这类构造调用,无法直接使用int值填充列表。

内容的提问来源于stack exchange,提问作者Jason Pan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:24:01