我很难理解 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} });
}
关于c++ - 构造函数中的初始化列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75375701/