In some situations it's desirable to be able to type-erase a callable (e.g. function, function pointer, object instance with operator()
, lambda, mem_fn
), for instance in Using Boost adaptors with C++11 lambdas where a copy-assignable and default-constructible type is required.
std::function
would be ideal, but there seems to be no way to automatically determine what signature to instantiate the class template std::function
with. Is there an easy way to get the function signature of an arbitrary callable and/or wrap it in an appropriate std::function
instantiation instance (i.e. a make_function
function template)?
Specifically, I'm looking for one or other of
template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }
such that make_function([](int i) { return 0; })
returns a std::function<int(int)>
. Obviously this wouldn't be expected to work if an instance is callable with more than one signature (e.g. objects with more than one, template or default-parameter operator()
s).
Boost is fine, although non-Boost solutions that aren't excessively complex are preferred.
Edit: answering my own question.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…