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

时间:2018-04-01 18:31:48

标签: c++

这里我有一个接受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 个答案:

答案 0 :(得分:2)

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

这应该适用于所有情况:

T

可能不需要制作第二个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。价值很好。