提问人:Zoso 提问时间:11/15/2023 更新时间:11/15/2023 访问量:83
初始化字符串对数组而不提及显式类型
Initializing an array of string pairs without mentioning explicit type
问:
我正在尝试初始化一个,但在没有明确包含类型的情况下无法在调用站点进行初始化。std::array
std::pair<std::string, std::string>
std::pair
下面是完整的可执行代码链接,下面是相关代码片段:
以下是别名和声明:
static constexpr size_t NUM_DATA = 3;
using DataPair = std::pair<std::string, std::string>;
using Mapping = std::array<DataPair, NUM_DATA>;
static std::shared_ptr<Foo> create(Mapping&& list);
explicit Foo(Mapping&& pairs);
下面是调用站点的代码:
auto x= Foo::create({
Foo::DataPair{"k1", "v1"},
Foo::DataPair{"k2", "v2"},
Foo::DataPair{"k3", "v3"}
});
// DOESN'T COMPILE!
// auto x= Foo::create({
// {"k1", "v1"},
// {"k2", "v2"},
// {"k3", "v3"}
// });
我的目标是 C++14。我想避免传入然后准备传出。std::initializer_list
std::array
答:
7赞
Some programmer dude
11/15/2023
#1
你需要另外几个卷曲的牙套。{}
一对用于对象,一对用于数组本身,然后一对用于数组中的每个“对”:std::array
auto x= Foo::create({{
{"k1", "v1"},
{"k2", "v2"},
{"k3", "v3"}
}});
1赞
Red.Wave
11/15/2023
#2
只需使用 std::to_array
。示例的相关部分完全是从提供的链接中复制的:
auto a4 = std::to_array<std::pair<int, float>>(
{{3, 0.0f}, {4, 0.1f}, {4, 0.1e23f}});
评论
0赞
Zoso
11/16/2023
我想避免在执行转换时重复,但还是不错的建议!std::pair<T,U>
0赞
Red.Wave
11/16/2023
您需要定义一个模板函数,其中包含对内置数组的引用参数(类似于固定类型),或者将可变参数模板绑定到第一个类型(例如 std::array 的 CTAD 指南)。我不想让你陷入如此复杂的境地,但你来了。to_array
上一个:如何加快字符串操作并避免缓慢循环
评论