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

C++如何为无默认参数的构造函数填充统一实参?

用同一默认值实例化构造函数无默认参数的类

当然可以实现,下面给你几种实用的纯C++方案,不需要额外依赖:

方案一:模板生成参数包(C++17及以上)

通过模板生成对应数量的参数,把单个值重复填充到每个参数位置,封装成工具函数后调用很方便:

通用参数生成版

#include <utility>
#include <tuple>

// 生成重复值的参数包工具
template<typename T, std::size_t... Is>
auto repeat_value(T val, std::index_sequence<Is...>) {
    // static_cast<void>(Is)用于避免编译器报Is未使用的警告
    return std::make_tuple((static_cast<void>(Is), val)...);
}

template<std::size_t ArgCount, typename T>
auto repeat(T val) {
    return repeat_value(val, std::make_index_sequence<ArgCount>{});
}

// 使用示例
int main() {
    auto args = repeat<4>(42);
    Something s(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args));
}

直接创建对象版

如果想省去手动解包的步骤,可以封装成直接生成目标对象的函数:

#include <utility>

template<typename ClassType, typename T, std::size_t... Is>
ClassType make_class_with_repeated(T val, std::index_sequence<Is...>) {
    return ClassType((static_cast<void>(Is), val)...);
}

template<std::size_t ArgCount, typename ClassType, typename T>
ClassType make_class_with_repeated(T val) {
    return make_class_with_repeated<ClassType>(val, std::make_index_sequence<ArgCount>{});
}

// 使用示例
int main() {
    Something s = make_class_with_repeated<4, Something>(42);
}

方案二:数组辅助法(C++11及以上)

如果参数数量固定且不多,直接用数组初始化后展开是个简单直接的办法:

int main() {
    int vals[] = {42, 42, 42, 42};
    Something s(vals[0], vals[1], vals[2], vals[3]);
}

这种方法不需要模板,适合快速实现,但灵活性稍差——参数数量变化时,需要手动修改数组长度和展开的索引。

补充说明

C++本身没有像你示例里sugar_stuff(42)...这种直接的语法糖,但通过上面的模板封装,可以达到几乎一致的效果:只需要传入一次默认值和构造函数的参数数量,就能自动填充所有参数位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:48:20