Я не знаю, может ли это быть даже достижимым, но учитывая этот набор функций \ class:
float plus1(float x) { return x+1; }
float div2(float x) { return x/2.0f; }
template <typename T>
class chain {
public:
chain(const T& val = T()) : val_(val) {}
chain& operator<<( std::function<float (float)> func ) {
val_ = func(val_);
return *this;
}
operator T() const {
return val_;
}
T val_;
};
Я могу связать функции, работающие с плавающими числами, следующим образом:
float x = chain<float>(3.0f) << div2 << plus1 << div2 << plus1;
Однако я хотел бы обобщить \ расширить это, чтобы иметь возможность конвертировать между типами и иметь функции с аргументами. К сожалению, я не достаточно умен, чтобы понять, как или если это можно сделать.
Точнее говоря, я бы хотел иметь возможность что-то подобным образом (где operator<<
- просто произвольный выбор, и, предпочтительно, мне даже не нужно писать «цепочку» в начале);
Кроме того, это всего лишь фиктивные примеры, я не собираюсь использовать их для арифметики.
std::string str = chain<float>(3.0) << mul(2.0f) << sqrt << to_string << to_upper;
или
vec3d v = chain<vec3i>(vec3i(1,1,1)) << normalize << to_vec3<double>;
Есть идеи?