Я хочу создать шаблонный класс или функцию, которая получает лямбду и помещает ее внутри std :: function ‹> Лямбда может иметь любое количество входных параметров [] (int a, float b, ...) std :: функция ‹> должна соответствовать типу лямбда-оператора ()
template <typename T>
void getLambda(T t) {
// typedef lambda_traits::ret_type RetType; ??
// typedef lambda_traits::param_tuple --> somehow back to parameter pack Args...
std::function<RetType(Args...)> fun(t);
}
int main() {
int x = 0;
getLambda([&x](int a, float b, Person c){});
}
Поэтому мне нужно как-то извлечь тип возвращаемого значения и пакет параметров.
Ответ здесь предлагает использовать частичную спецификацию лямбда-оператора :: ()
template <typename T>
struct function_traits : public function_traits<decltype(&T::operator())>
{};
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
// we specialize for pointers to member function
{
enum { arity = sizeof...(Args) };
// arity is the number of arguments.
typedef ReturnType result_type;
template <size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
// the i-th argument is equivalent to the i-th tuple element of a tuple
// composed of those arguments.
};
};
Но мне нужен способ преобразовать кортеж ‹> обратно в пакет параметров, чтобы создать правильный экземпляр std :: function‹>
index_sequence
- важная идея. 22.04.2017decltype
в возвращаемом выражении. Это уродливо, однообразно и бессмысленно ... но таков TMP в C ++ 11 :-). 22.04.2017std::index_sequence
недоступен в C ++ 11 :( 02.06.2017