У меня есть следующий код:
#include <iostream>
#include <string>
#include <array>
#include <map>
#include <functional>
template<typename T> struct tag {};
template <typename LambdaType, typename=void>
struct split {
split(LambdaType &&f) {
std::cout << "[]()" << std::endl;
}
};
template <typename RetType, typename... ArgTypes>
struct split<std::function<RetType(ArgTypes...)>> {
split(std::function<RetType(ArgTypes...)> &&f) {
std::cout << "std::function" << std::endl;
};
};
template <typename RetType, typename... ArgTypes>
struct split<RetType(*)(ArgTypes...)> {
split(RetType(*f)(ArgTypes...)) {
std::cout << "func-ptr" << std::endl;
};
};
void f1(int) {};
int
main(int argc, char **argv) {
new split<std::decay<decltype(f1)>::type>(f1);
new split<std::function<void(int)>>(std::function<void(int)>([](int) {}));
/* how can I extract the argument type template pack from lambda ? */
new split([](int){});
return 0;
}
Есть две специализации для split
, одна для std::function<RetType(ArgTypes...)>
и одна для RetType(*)(ArgTypes...)
. Для обеих специализаций я получаю аргумент шаблона RetType
и ArgTypes...
и упаковываю по шаблонам. Однако мне интересно, есть ли способ сделать то же самое с lambda
в качестве аргумента?
Как я могу извлечь RetType
и ArgTypes...
лямбды в специализации для строки new split([](int){})
?