函数参数如何作为类构造函数值传递?Seastar生成器参数使用疑问
问题解答
1. 函数参数如何传递给类构造函数?
有几种常见的实现方式:
- 直接传递参数:在函数内部创建类实例时,直接将函数参数传入构造函数,适用于参数类型和构造函数匹配的场景:
class DishMaker { public: DishMaker(int max_cap) : max_capacity(max_cap) {} private: int max_capacity; }; void init_maker(int param) { DishMaker maker(param); // 直接把函数参数传给构造函数 }
- 转发参数(保留值属性):如果函数使用万能引用参数,通过
std::forward转发给构造函数,能保留参数的左值/右值特性,常用于模板函数:
template<typename T> void create_maker(T&& param) { DishMaker maker(std::forward<T>(param)); // 转发参数,避免不必要的拷贝 }
- 多参数传递与打包展开:针对构造函数需要多个参数的情况,可以直接传递多个函数参数,或者将参数打包为
tuple后展开:
class DishMaker { public: DishMaker(int cap, std::string name) : max_capacity(cap), maker_name(name) {} private: int max_capacity; std::string maker_name; }; // 直接传递多参数 void setup_maker(int cap_param, std::string name_param) { DishMaker maker(cap_param, name_param); } // 从tuple展开参数(C++17+) #include <tuple> void setup_from_tuple(std::tuple<int, std::string> args) { auto maker = std::make_from_tuple<DishMaker>(std::move(args)); }
2. max_dishes_on_table在Seastar生成器中的使用逻辑
在你提供的代码里,max_dishes_on_table是通过Seastar生成器的隐式参数捕获与容器初始化机制生效的:
seastar::coroutine::experimental::generator<Dish, seastar::circular_buffer>的第二个模板参数指定了生成器用来缓存co_yield产出值的容器是circular_buffer(环形缓冲区)。max_dishes_on_table的类型是coroutine::experimental::buffer_size_t,这是Seastar生成器专门用来配置内部缓存容器大小的标记类型。- 当编译器将带有
co_yield的make_dishes函数转化为生成器对象时,函数的max_dishes_on_table参数会被自动捕获到生成器的内部状态中,用来初始化底层的circular_buffer,限制缓冲区最多能缓存的Dish对象数量。 - 这个参数不需要显式在函数体内引用,因为Seastar的生成器实现会识别
buffer_size_t类型的参数,自动用它来设置缓存上限,避免生成器无限制缓存产出值导致内存溢出。
内容的提问来源于stack exchange,提问作者Deborah C
相关产品推荐
相关产品推荐

