假設我正在開發一個類Vec<T>
,它表示一個數學向量,其元素類型爲T
。過載類型轉換爲初始化列表
爲了方便我創建了一個需要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)
}
顯示你的'operator + ='。這應該已經按照您的描述工作了。 –
'v == {8,9}'在語法上無效。 – cpplearner
['operator + ='just works](http://rextester.com/NBE83364),沒有額外的努力。我想大多數其他運營商也會這樣。 'operator =='是一個例外;在頂部,我不太清楚爲什麼它在這裏很特別。 –