配列の加算のために加算演算子(+)をオーバーロードすることは可能ですか? 何かのようなもの:
double operator+ (double a[], double b[])
{
double c[];
c[] = a[] + b[];
return c;
}
配列の加算のために加算演算子(+)をオーバーロードすることは可能ですか? 何かのようなもの:
double operator+ (double a[], double b[])
{
double c[];
c[] = a[] + b[];
return c;
}
いいえ。
「T の配列」型のパラメーターは、コンパイル時に「T へのポインター」型に調整されるため、宣言は次のようになります。
double operator+ (double a[], double b[])
本当に意味:
double operator+ (double *a, double *b)
また、ポインター型のオーバーロードを定義することはできませんoperator+
(少なくとも gcc はそうは考えていません。私はそれが正しいと信じています)。
また、配列型を戻り値の型として関数を宣言することもできません。試してみると、ポインター型に調整されていないだけで、違法です。
std::vector
何らかのコンテナ タイプ ( , )の引数を取る関数を定義できますstd::array
。これは、いずれにせよ、より便利になる可能性があります。
operator+
左オペランドと右オペランドのサイズが異なる場合は、どうすればよいかを必ず考えてください。(例外をスローすることは、合理的なアプローチの 1 つです。)
非クラス型のオペランドを取るグローバル演算子をオーバーロードすることはできません。幸いなことに、代わりに使用できるstd::vector<T>
(クラス型の) ものがあります。
#include <vector>
#include <algorithm>
#include <iostream>
template <typename T>
std::vector<T> operator +(std::vector<T> lhs, std::vector<T> rhs)
{
std::vector<T> temp;
temp.insert(temp.end(), lhs.begin(), lhs.end());
temp.insert(temp.end(), rhs.begin(), rhs.end());
return temp;
}
int main()
{
std::vector<int> x{1, 2, 3}, y{4, 5, 6};
std::vector<int> z(x + y);
for (auto a : z)
std::cout << a << ' '; // 1 2 3 4 5 6
}
ここにデモがあります。
いいえ、できません。しかし、この方法で配列をラップするクラスを書くことができます:
#include <iostream>
#include <algorithm>
class Array {
int* arr;
int arr_size;
public:
Array(int n): arr(new int[n]), arr_size(n) {}
~Array(){ delete[] arr; }
int& operator[](int n) { return arr[n]; }
Array operator+(Array& other) {
Array to_return(arr_size);
for(int i=0 ; i < std::min(arr_size, other.arr_size) ; i++)
to_return[i] = arr[i] + other[i];
return to_return;
}
};
int main() {
int tmp1[] = {1, 2, 3, 4};
int tmp2[] = {5, 6, 7, 8};
Array arr(4), arr2(4);
for(int i=0 ; i < 4 ; i++) {
arr[i] = tmp1[i];
arr2[i] = tmp2[i];
}
for(int i=0 ; i < 4 ; i++)
std::cout << (arr + arr2)[i] << ' ';
return 0;
}
出力:
6 8 10 12
直接ではありません。原則として、配列を取る (参照する) 関数を書くことができます:
// returns a[0]*b[0] + a[1]*b[1] + ... + a[N-1]*b[N-1]
template <int N>
double innerProduct(double const (& a)[N], double const (& b)[N])
{
double sum = 0;
for (size_t i = 0; i < N; ++i) sum += a[i] * b[i];
return sum;
}
しかし、いくつかの問題があります。
operator+
(または他の演算子) はできません。少なくとも 1 つのパラメーターがユーザー定義の場合にのみ実行できます (配列の場合はそうではありません)。たとえばhttp://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=256を参照してください。したがって、配列をユーザー定義型でラップするか、通常の関数 ( などaddInto
) を使用します。戻り値については、パラメータとして埋められる結果配列を渡すか、または のような他の型を返しますstd::vector
。
例:
// c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; ... c[N-1]=a[N-1]+b[N-1];
template <int N>
void addInto(double const (& a)[N], double const (& b)[N], double (& out)[N])
{
for (size_t i = 0; i < N; ++i) out[i] = a[i] + b[i];
}
作成したクラスの任意の演算子をオーバーロードできます。演算子のオーバーロードは、コードを読みやすくするためだけのものであることに注意してください。演算子があまり明白ではないことを行う場合は、おそらくまったくオーバーロードする必要があります。また、あなたが考えているこの特定のものに対しては、おそらく配列用の独自のラッパー クラスを作成する必要があります。operator +
はポインターに対して既に定義されているため、直接オーバーロードすることはできません。operator +
c++ でベクトルまたは配列データ型をオーバーロードできる場合があります