gpt4 book ai didi

c++ - 将初始化列表或集合作为参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:52 25 4
gpt4 key购买 nike

这里我有一个构造函数可以接受 std::vector<>std::initializer_list ,但它不接受初始化列表。注释掉的 ctor 将接受初始化列表,但不接受 std::vector<>。或 std::initializer_list .

class C
{
std::vector<int> values;

public:
template <class Container> explicit C(const Container& container)
{
values = std::vector<int>(container);
}

// explicit C(const std::initializer_list<int>& initializer_ist)
//{
// values = std::vector<int>(initializer_ist);
//}
};

std::vector<int> v{1, 2, 3};
C c_from_vector(v); // OK

auto initializer_list = {1, 2, 3};
C c_from_initializer_list(initializer_list); // OK

C c_from_initializer_list2({1, 2, 3}); // ERROR

我可以编写一个适用于所有 3 个调用的构造函数吗?

最佳答案

你需要两个构造函数,因为你不能推导出像 {1, 2, 3} 这样的 braced-init-list - 必须匹配特定类型或 initializer_list<T> (其中推导出 T)。但请确保使用 mem-initializer 而不是仅在正文中分配。

这应该适用于所有情况:

template <typename... Args,
std::enable_if_t<std::is_constructible<std::vector<int>, Args&&...>::value, int> = 0>
explicit C(Args&&... args)
: values(std::forward<Args>(args)...)
{ }

C(std::initializer_list<int> lst)
: values(lst)
{ }

可能不需要做第二个explicit .另请注意,没有理由采取 initializer_list通过 const& .按值(value)算就好了。

关于c++ - 将初始化列表或集合作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601320/

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