У меня есть вектороподобный класс, который содержит массив объектов типа "T"
, и я хочу реализовать 4 арифметических оператора, которые будут применять операцию к каждому элементу:
// 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];
};
Поскольку операторы будут содержать один и тот же шаблонный код (зацикливание на каждом элементе и применение соответствующей операции), я подумал, что могу обобщить его:
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];
};
Теперь проблема в том, как передать оператор, который принимает два внутренних типа и возвращает от void
до do_for_each
, как показано в примере выше? C ++ не позволяет мне делать этот трюк для внутренних типов ("T::operator+="
не будет работать, если "T"
равен "int"
).