在编译时迭代函数参数类型 < > C++中有什么方法可以在编译时迭代函数参数类型吗?我想这样做: struct null_type {}; float foo(int, bool, char); get_param_type<foo, 0>::type float_var; // return type get_param_type<foo, 1>::type int_var; // first arg type get_param_type<foo, 2>::type bool_var; // second arg type get_param_type<foo, 3>::type char_var; // third arg type get_param_type<foo, 4>::type null_type_var; struct null_type{}; 浮点foo(int、bool、char); get_param_type::type float_var;//返回类型 获取参数类型::类型int\u var;//第一个参数类型 获取参数类型::类型bool\u var;//第二个参数类型 获取参数类型::类型字符变量;//第三个arg类型 get_param_type::type null_type_var;
您可以自己轻松编写。首先,将函数参数类型打包到一个元组中:在编译时迭代函数参数类型 < > C++中有什么方法可以在编译时迭代函数参数类型吗?我想这样做: struct null_type {}; float foo(int, bool, char); get_param_type<foo, 0>::type float_var; // return type get_param_type<foo, 1>::type int_var; // first arg type get_param_type<foo, 2>::type bool_var; // second arg type get_param_type<foo, 3>::type char_var; // third arg type get_param_type<foo, 4>::type null_type_var; struct null_type{}; 浮点foo(int、bool、char); get_param_type::type float_var;//返回类型 获取参数类型::类型int\u var;//第一个参数类型 获取参数类型::类型bool\u var;//第二个参数类型 获取参数类型::类型字符变量;//第三个arg类型 get_param_type::type null_type_var;,c++,templates,C++,Templates,您可以自己轻松编写。首先,将函数参数类型打包到一个元组中: #include <tuple> template <typename> struct FnArgs; template <typename R, typename ...Args> struct FnArgs<R(Args...)> { using type = std::tuple<Args...>; }; #包括 模板结构FnArgs; 模板 结构FnArg
#include <tuple>
template <typename> struct FnArgs;
template <typename R, typename ...Args>
struct FnArgs<R(Args...)>
{
using type = std::tuple<Args...>;
};
#包括
模板结构FnArgs;
模板
结构FnArgs
{
使用type=std::tuple;
};
现在,您可以使用标准元组API访问元素:
using FT = FnArgs<decltype(foo)>::type;
std::tuple_element<0, FT> x;
使用FT=FnArgs::type;
std::tuple_元素x;
如果需要,可以很容易地添加指向成员函数的指针的进一步专门化
(您无法轻松绕过
decltype
,因为对于非类型模板参数(尚未)没有类型推断)。这里有一个版本,它使用您的null\u type
进行越界索引:
template <typename, std::size_t, typename = void>
struct get_param_type
{
using type = null_type;
};
template <typename Ret, typename... Args, std::size_t N>
struct get_param_type<Ret(Args...), N, std::enable_if_t<N < (1+sizeof...(Args))>>
{
using type = typename std::tuple_element<N,std::tuple<Ret,Args...>>::type;
};
模板
结构获取参数类型
{
使用类型=null\u类型;
};
模板
结构获取参数类型
{
使用type=typename std::tuple\u元素::type;
};
@buttifulbuttefly:20k loc和4GB RAM之后…:-)@ivaigult:正如我所说的,我相信单凭模板是不可能的。如果不指定非模板参数的类型,则不能使用非模板参数。(如果愿意,可以编写宏。)