逻辑
这可以通过重载operator,(运算符逗号)来实现,例如使其将新的浮点值推送到M。
需要注意的是operator, 应该始终具有至少一个类类型参数,因此您必须创建一个可隐式转换为浮点值的类(例如通过非explicit 构造函数1 个 double 或 float 类型的参数)。
示例
例如,我们将尝试对std::vector 上的包装器类型执行此操作,并且我们将尝试使M = 1, 2, 3, 4, 5 成为一个有效的表达式,从而生成具有这些元素的std::vector。您会发现这很容易适用于您给出的矩阵示例。
要记住的是operator= 比operator, 具有更高的优先级(如this table of operator precedence 所示);因此M = 1, 2, 3, 4, 5 将真正被解析为:(((((M = 1), 2), 3), 4), 5)。
鉴于此,我们将首先创建带有 operator= 的类 container,该类接受单个值并将其推送到容器中:
template<typename ValueType>
struct container {
explicit container(std::size_t n) {
vec.reserve(n);
}
container& operator=(ValueType a) {
vec.push_back(a);
return (*this);
}
std::vector<ValueType> vec;
};
此时我们可以将operator,定义为:
template<typename ValueType>
container<ValueType>& operator,(container<ValueType>& m, ValueType a) {
m.vec.push_back(a);
return m;
}
这只是推回一个新的元素值。
现在您可以很容易地看到以下工作正常并打印1 2 3 4 5:
int main() {
container<int> M(5);
M = 1, 2, 3, 4, 5;
for (auto i : M.vec) std::cout << i << ' ';
}
Live demo
注意事项
我尽可能不鼓励这种技术。它迫使您对其他运算符(例如 operator=)具有奇怪的语义,并且实际上似乎对 std::initializer_list<T> 的简单使用没有任何添加。
一个更理智的例子是 operator= 如下:
container& operator=(std::initializer_list<ValueType> a) {
std::copy(begin(a), end(a), back_inserter(vec));
return (*this);
}
然后简单地使用括号:
int main() {
container<int> M(5);
M = { 1, 2, 3, 4, 5 };
for (auto i : M.vec) std::cout << i << ' ';
}
Live demo