要素の数と要素の型をテンプレート引数として受け取るVectorクラスを作成しました。
template<int n, class T>
class Vector
{
public:
T data[n];
Vector()
: data{}
{
}
Vector(T const value)
{
std::fill_n(data, n, value);
}
template<class ...U, typename std::enable_if<sizeof...(U) == n, int>::type = 0>
Vector(U &&...u)
: data{std::forward<U>(u)...}
{
}
T& operator[](int const index)
{
return data[index];
}
template<class U>
operator Vector<n, U>()
{
Vector<n, U> out;
std::copy_n(data, n, out.data);
return out;
}
};
クラスの演算子が必要ですが、異なる要素タイプのベクトル間で変換を行うには、クラス本体内で宣言および定義されたフレンド関数である必要があります。ただし、Vector 2、3、および4用に3つの特殊なテンプレートクラスも必要です。すべての演算子を4回、各クラス本体内に1回書き込む必要がないためです。この演算子を、右側のベクトルの要素タイプの追加のテンプレート引数と一緒に使用できますか?
template<int n, class T, class U>
inline Vector<n, T>& operator+=(Vector<n, T> &lhs, Vector<n, U> const &rhs)
{
for(int i = 0; i < n; ++i)
{
lhs.data[i] += rhs.data[i];
}
return lhs;
}
こうするのではなく、クラス内で友達演算子を使うのには理由があるのかもしれませんが、今のところ問題ないようですが、何か見落としていませんか?
ここには、パーツの合計以外に何もありません。「friend」は、演算子が使用する可能性のある非公開メンバーへのアクセスを許可するために使用され、クラス内に定義を配置すると、入力が節約されます(暗黙的にインラインになり、単一定義規則の問題を回避します)。クラスをまとめる場合は、友達になる必要があるかどうかを考えるのを遅くすることなく、「友達...」演算子定義の入力を開始できます。クラス内に演算子をリストすることを好む人もいるかもしれません-誰かがクラスを調べて使用可能な関数を確認するときに、演算子が確実に表示されるようにします-しかし、プログラマーは通常、クラスの後に演算子を探すことに慣れています...。
コードが機能すれば、すべて問題ありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加