初始化字符串对数组而不提及显式类型

Initializing an array of string pairs without mentioning explicit type

提问人:Zoso 提问时间:11/15/2023 更新时间:11/15/2023 访问量:83

问:

我正在尝试初始化一个,但在没有明确包含类型的情况下无法在调用站点进行初始化。std::arraystd::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_liststd::array

C++ 初始化 C++14

评论

2赞 Pepijn Kramer 11/15/2023
我建议你不要使用 std::p air,除非你在某个类模板中。在几乎所有其他情况下,最好声明一个包含两个可读成员的自己的结构。这样的结构还增加了语义,使得错误地使用部分代码变得更加困难。

答:

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