たとえば、の要素を持つ数学的ベクトルを表すクラスVec<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のようなものをサポートしていますか?
EDIT:
だから、ここに私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+
されています。残念ながら、v + {1, 2}
は文法規則のためのC++で整形式ではありません
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 =='は例外です。トップから離れて、私はそれがなぜここで特別なのかよく分かりません。 –