Mam klasę podobną do wektora, która zawiera tablicę obiektów typu "T"
i chcę zaimplementować 4 operatory arytmetyczne, które zastosują operację na każdym elemencie:C++: Używanie operatora dwóch typów wewnętrznych jako obiektu funkcji
// Constructors and other functions are omitted for brevity.
template<class T, unsigned int D>
class Vector {
public:
// Add a value to each item: naive implementation.
void operator += (const T&) {
for (int i = 0; i < D; ++i) {
data[i] += value;
}
}
void operator -= (const T&) { ... }
void operator *= (const T&) { ... }
void operator /= (const T&) { ... }
private:
T items[D];
};
Ponieważ operatorzy będą zawierać ten sam kod szablonowe (zapętlenie nad każdym elementem i stosując odpowiednią operację), myślałem, że mógłbym go uogólniać:
template<class T, unsigned int D>
class Vector {
public:
void operator += (const T& value) { do_for_each(???, value); }
void operator -= (const T& value) { do_for_each(???, value); }
void operator *= (const T& value) { do_for_each(???, value); }
void operator /= (const T& value) { do_for_each(???, value); }
private:
void
do_for_each(std::binary_function<void, T, T>& op, T value) {
std::for_each(data, data + D, std::bind2nd(op, value));
}
T data[D];
};
teraz problemem jest to, w jaki sposób przekazać operator, który przyjmuje dwie wartości wewnętrzne ic typy i zwraca void
do do_for_each
, jak pokazano w powyższym przykładzie? C++ nie pozwala mi zrobić tej sztuczki dla typów wewnętrznych ("T::operator+="
nie zadziała, jeśli "T"
jest "int"
).
Może chcesz naprawić '' items' data' vs ... – Alastair
Dzięki, stałe też poniżej –
Pytania takie jak to, dlaczego przyjaciele nie pozwalają przeciążać operatorów – Jonathan