假设我正在开发类Vec<T>
,它表示类型为T
的元素的数学 vector 。
为了方便起见,我创建了使用std::initializer_list
的构造函数:
Vec(std::initializer_list<T> l)
: size(l.size())
{
data = new T[size];
std::copy(l.begin(), l.end(), data);
}
现在,我可以做以下事情:
v += Vec<int>({ 1, -1 });
bool equal = (v == Vec<int>({ 8, 9 }));
依此类推...但是,如果我能写得更短,更简洁的话,那就太好了:
v += { 1, -1 };
bool equal = v == { 8, 9 };
如何实现这种行为?我想我可以将类型转换运算符重载到
std::initializer_list
,但是它甚至被认为是正常做法吗?它对编译时间和性能有多严重,甚至可以工作吗?那么
std::vector
呢,它在C++ 11中支持吗?编辑:
所以,这是我的
operator+=
:Vec<T> & operator+=(const Vec<T> &v)
{
assert(size == v.size);
for (int i = 0; i < size; ++i)
data[i] += v.data[i];
return *this;
}
注释中的答案是正确的,
initializer_list
实际上在赋值运算符之后有效:v += {2, 3};
v -= {2, 3};
我试图写这样的东西:
v = v + {2, 3};
这就是为什么它不起作用。
因此,结论是:您可以在赋值和复合赋值运算符之后像这样使用它,但是对于二进制算术运算符和比较而言,它将不起作用,对吗?我想创建自定义文字也不是一种选择。
顺便问一下:
const Vec<float> a{ 1.01, 2.02 }; // error: conversion from 'double' to 'float' requires a narrowing conversion test_app
const Vec<float> b{ 1.01f, 2.02f }; // works, obviously
在第一种情况下,我可以做些事情来启用隐式转换吗?
EDIT2
这是
operator+
:friend Vec<T> operator+(Vec<T> v, const Vec<T> &w)
{
v += w; // reuse compound assignment
return v; // return the result by value (uses move constructor)
}
最佳答案
不幸的是,对于语法规则,v + {1, 2}
并不是C++中格式正确的表达式。大多数二进制运算符仅对每个操作数采用表达式,而括号列表不是表达式。复合赋值运算符+=
是特殊的,因为赋值也接受右侧操作数的初始化子句,因此v += {1, 2}
可以正常工作。
一些替代方案:
operator+(v, {1, 2})
v + Vec<int>({1, 2})
关于c++ - 重载类型转换为初始化列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37775045/