gpt4 book ai didi

c++ - 使用 { }, { } 将多个 std::pair 传递给可变参数模板构造函数

转载 作者:行者123 更新时间:2023-11-30 02:34:34 25 4
gpt4 key购买 nike

我遇到了一个我真的不知道如何解决的问题。我想在构造函数中传递可变数量的对,使用 { }大括号,但由于某种原因我开始编译错误。我让类尽可能简单

class MyPairs
{
public:

MyPairs(std::pair<char, int>&& pair)
{
pairs[pair.first] = pair.second;
}

template <typename ... Args>
MyPairs(std::pair<char, int>&& pair, Args&& ... args)
{
pairs[pair.first] = pair.second;
MyPairs(std::forward<Args>(args)...);
}

private:
std::map<char, int> pairs;

};

int main()
{
MyPairs p1( // okay, constructor expects pairs
std::pair<char, int>('a', 1),
std::pair<char, int>('b', 2)
);

MyPairs p2( // okay, compiler knows that it is std::pair<char, int> in constructor
{ 'c',3 }
);

MyPairs p3( // error, for some reason now he doesnt know it is std::pair<char, int>, std::pair<char, int>
{ 'd',6 },
{ 'e',5 }
);
}

我当然可以写std::pair<char, int>('a', 1)对于每个参数,但是 {'a', 1}更方便。

为什么编译器在使用 { } 时不知道如何匹配函数大括号?

最佳答案

最简单的方法可能是使用 list initialization , 并提供一个接受 std::initializer_list<T> 的构造函数.事实上,就是这样std::map's constructor (5) 做到了。

例如:

MyPairs(std::initializer_list<std::map<char, int>::value_type> init) : pairs(init) {}

See it live on Coliru

这里唯一棘手的一点是我们不能使用 std::intializer_list<std::pair<char, int>> (因为 std::map<Key, T>value_type 定义为 std::pair<const Key, T> ),因为它不能转换为 std::intializer_list<std::pair<const char, int>> map 的构造函数正在等待。

关于c++ - 使用 { }, { } 将多个 std::pair 传递给可变参数模板构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com