C++中能否向ListObjects隐式传递选项?自定义结构体编译报错求助
问题描述
我需要向ListObjects()传递多种选项,例如MaxResults()、Prefix()和StartOffset()。每次调用ListObjects()时,选项的组合可能不同,因此我想知道是否可以通过初始化某个结构体或对象来传递这些选项,示例如下:
struct/object opts; opts.MaxResults = 100; opts.Prefix = "test-"; opts.StartOffset = "test-1"; client->ListObjects(bucket, opts);
编辑补充:
我已定义了一个选项结构体:
struct list_objects_options { std::optional<gcs::MaxResults> count; std::optional<gcs::Delimiter> filter; };
同时编写了多个针对不同输入的重载函数:
list_objects(std::size_t count, std::string filter) { list_objects_options opts; opts.count = gcs::MaxResults(count); opts.filter = gcs::Delimiter(filter); return list_objects(opts); } list_objects(std::string filter) { ... }
这些重载函数最终会调用:
list_objects(list_objects_options opts) { google::cloud::StatusOr<gcs::ListObjectsReader> response = client->ListObjects(m_bucket, opts); }
但使用CMake构建时,出现错误:no matching function call to ‘google::cloud::storage::v2_14::internal::GenericRequest<...>::set_option(list_objects_options&)’
解决方案
- 你自定义的
list_objects_options结构体并不是GCS客户端库能识别的选项类型,直接传给client->ListObjects()自然会报错。GCS的ListObjects()方法接受的是库自带的选项对象(比如gcs::MaxResults、gcs::Delimiter这类),或者用库提供的Options容器来统一管理,而非自定义结构体。 - 如果你想保留自己的结构体管理选项,需要在最终调用GCS接口时,把结构体里的非空选项逐个提取出来传递:
修改最终的重载函数如下:list_objects(list_objects_options opts) { std::vector<google::cloud::storage::Option> gcs_options; if (opts.count.has_value()) { gcs_options.push_back(*opts.count); } if (opts.filter.has_value()) { gcs_options.push_back(*opts.filter); } // 将选项列表展开传递给ListObjects return client->ListObjects(m_bucket, std::move(gcs_options)); } - 更省心的方式是直接使用GCS库的
Options类来管理选项,无需自己定义结构体:
这种方式下,未设置的选项会被库自动忽略,不需要手动处理可选值逻辑。list_objects(std::size_t count, std::string filter) { google::cloud::Options opts; opts.set<gcs::MaxResults>(count); opts.set<gcs::Delimiter>(std::move(filter)); return client->ListObjects(m_bucket, opts); } list_objects(std::string filter) { google::cloud::Options opts; opts.set<gcs::Delimiter>(std::move(filter)); return client->ListObjects(m_bucket, opts); }
内容的提问来源于stack exchange,提问作者chuck
相关产品推荐
相关产品推荐

