【发布时间】:2016-12-05 21:30:17
【问题描述】:
我有以下一段代码,其中我使用模板化的static 方法random 定义了struct quick,并具有一些特化:
(我使用了其他 SO 答案中的function_traits。附在底部以供参考。)
struct quick
{
template <typename T>
static T random();
template <typename F>
static void check(F f)
{
constexpr auto arity = function_traits<F>::arity; // easy :)
std::cout << arity << std::endl;
typedef typename function_traits<F>::template arg<0>::type type0; // easy:)
// how to get all types of all F's parameters?
}
};
template <>
std::string quick::random<std::string>()
{
return std::string("test");
}
template <>
int quick::random<int>()
{
return 1;
}
我想在check 中获取F 的所有类型的参数,以便生成带有随机条目的tuple(基于我的random 方法特化)。
像这样:
auto t0 = std::make_tuple(quick::random<AllTypes>()...); //pseudo code
auto t =
std::make_tuple(quick::random <
function_traits<F>::template arg<std::make_index_sequence<arity>>::type...
>
()...
);
我尝试过类似的东西:
template<typename F, typename ...TIdxs>
using ArgTypes = typename function_traits<F>::template arg<TIdxs>::type...;
// ...
// inside check
typedef ArgTypes<F, std::make_index_sequence<arity>> types;
但惨败:
main.cpp:80:72: error: expected ‘;’ before ‘...’ token
using ArgTypes = typename function_traits<F>::template arg<TIdxs>::type...;
^
main.cpp: In static member function ‘static void quick::check(F, D)’:
main.cpp:98:15: error: ‘ArgTypes’ does not name a type
typedef ArgTypes<F, std::make_index_sequence<arity>> types;
我使用了来自this SO answer的function traits 实用程序。
template <typename T>
struct function_traits : function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its '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.
};
};
【问题讨论】:
-
像往常一样,函数特性 onky 有时会起作用。
auto f=[](auto&&x){return 2*x;}.
标签: c++ templates c++11 c++14 typetraits