I don’t know if this can even be achivieable, but given these set of functions\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_;
};
I can chain functions operating on floats like this:
float x = chain<float>(3.0f) << div2 << plus1 << div2 << plus1;
However, I’d like to generalize\extend this to being able to convert between types and have functions with arguments. Unfortunately I’m not smart enough to figure out how, or if, this can be done.
Too be more specific I’d like to be able to do something like this (Where operator<< is just an arbitary choice, and preferably I dont even have to write “chain” at the beginning);
Also, these are just dummy examples, I do not intend to use it for arithmetics.
std::string str = chain<float>(3.0) << mul(2.0f) << sqrt << to_string << to_upper;
or
vec3d v = chain<vec3i>(vec3i(1,1,1)) << normalize << to_vec3<double>;
Any ideas?
A general and extendable solution using boost::proto :
The basic idea is to wrap function objects as proto terminals, build a small | based grammar and let the proto system deals with the composition.