c++ - 构造函数中的初始化列表问题

标签 c++ c++11 initializer-list stdinitializerlist

我很难理解 std::initializer_list 是如何工作的。我 checked other questions ,但没有找到任何相关内容(或者我没看到?)。

假设我有这个:

template<typename T> 
struct Point
{
    T x,y;
};

template<typename T> 
struct A
{
    std::vector<Point<T>> v;
};

然后我可以构建:

int main()
{
   A<int> a{ std::vector<Point<int>> { {4,4}, {5,5},{6,6} } };
}

但我想让事情更简单,所以我可以写:

int main()
{
   A<int> a( { {4,4}, {5,5},{6,6} } );
}

我试过:

template<typename T> 
struct A
{
    std::vector<Point<T>> v;
    template<typename U>
    A( const std::initializer_list<Point<U>>& il ) : v{il}
    {}
};

但这失败了,see live demo .

我怎样才能编写允许这样做的构造函数?这可能吗?

最佳答案

你的构造函数不应该是模板,你的类已经是。 {..} 没有类型,可以推导为很少的类型。

删除后,以下工作:

template<typename T> 
struct A
{
    std::vector<Point<T>> v;

    A( const std::vector<Point<T>>& in ) : v(in) {}

    A( const std::initializer_list<Point<T>>& il ): v{il}
    {}
};

int main()
{
    std::vector<Point<int>> v{ {4,4}, {5,5},{6,6} };
    A<int> a1( std::vector<Point<int>> { {4,4}, {5,5},{6,6} } ); // this is fine
    assert( a1.v.size() == 3 );

    A<int> a2{{4,4}, {5,5}, {6,6} };
    assert( a2.v.size() == 3 );

    A<int> a3({{4,4}, {5,5}, {6,6} });
}

Demo

关于c++ - 构造函数中的初始化列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75375701/

相关文章:

C++11 std::to_string(double) - 没有尾随零

带有初始化列表的 C++ 的 max() 返回乱序的字符串

c++ - 在 C++ 中使用浮点文字初始化整数数组的成员

c++ - 通过拒绝方法使用 CUDA 生成随机数。性能问题

c++ - 无法正确创建线程

c++ - Qt:恢复 QTextEdit 的几何形状失败

c++ - 如何在msvc中添加高亮关键字

c++ - std::begin 和 std::end 不能使用指针和引用,为什么?

c++ - 在一个类中使用具有成员函数的通用 std::function 对象

c++ - 如何从初始化列表中分配一个数组?