我有一个元函数,它给了我I
一个 lambda/函数的 -th 参数的类型:
#include <iostream>
#include <tuple>
namespace details
{
//! Spezialization for Funktion-Pointers
template<typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (*)(Args...));
//! Spezialization for Functor/Lambdas
template<typename F, typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (F::*)(Args...));
//! Spezialization for Functor/Lambdas
template<typename F, typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (F::*)(Args...) const);
}; // namespace details
template<typename F, std::size_t I>
using GetArg = std::tuple_element_t<I, decltype(details::getArgs(std::declval<F>()))>;
int main()
{
auto f1 = [](int a, int b){};
static_assert(std::is_same<GetArg<decltype(f1), 0>, int>{}, "Not the same!");
// auto f2 = [](int a, auto b){};
// static_assert(std::is_same<GetArg<decltype(f2), 0>, int>{}, "Not the same!");
}
带有说明符的第二个 lambdaauto
无法编译,因为我的 spezializations 不匹配,因为auto
它就像一个T
未知的模板参数。有没有办法让这项工作f2
也有效?
由于 lambda 是一种不透明类型,并且模板函数没有类型,除非使用模板参数类型进行实例化,所以我真的不知道如何使它工作?这是不可能的吗?