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
相关产品推荐
相关产品推荐

