给定C ++ 11函数:
X f(A, B, C);
无论如何都有这个功能:
template<typename T>
void g(T t)
{
...
}
如下所示:
g(f);
确定:
...
template<typename F>
void g(F f)
{
constexpr size_t n = num_params<F>::n; // 3
return_type<F>::type x; // X
tuple<param_types<F>::type...> a; // tuple<A, B, C>
}
答案 0 :(得分:7)
不确定
template <typename R, typename ...Args>
void g(R(&f)(Args...))
{
typedef R return_type;
unsigned int const n_args = sizeof...(Args);
// ...
}
用法:
int foo(char, bool);
g(foo);
答案 1 :(得分:2)
我曾经做过的事情就是我想要做的事情 - 然而它仅限于最多定义一个函数调用操作符的函子(lambdas符合这个限制)。它也适用于MSVC 2012 CTP。
namespace detail {
////////////////////////////////////////////////////////////////////////////
//! Select between function pointer types
////////////////////////////////////////////////////////////////////////////
template <typename T>
struct callable_helper_ptr;
//! non-member functions
template <typename R, typename... Args>
struct callable_helper_ptr<R (*)(Args...)> {
typedef void object_t;
typedef R result_t;
typedef std::tuple<Args...> args_t;
};
//! member functions
template <typename R, typename O, typename... Args>
struct callable_helper_ptr<R (O::*)(Args...)> {
typedef O object_t;
typedef R result_t;
typedef std::tuple<Args...> args_t;
};
//! const member functions
template <typename R, typename O, typename... Args>
struct callable_helper_ptr<R (O::*)(Args...) const> {
typedef O object_t;
typedef R result_t;
typedef std::tuple<Args...> args_t;
};
////////////////////////////////////////////////////////////////////////////
//! Select between function pointers and functors
////////////////////////////////////////////////////////////////////////////
template <typename T, typename is_ptr = typename std::is_pointer<T>::type>
struct callable_helper;
//! specialization for functors (and lambdas)
template <typename T>
struct callable_helper<T, std::false_type> {
typedef callable_helper_ptr<decltype(&T::operator())> type;
};
//! specialization for function pointers
template <typename T>
struct callable_helper<T, std::true_type> {
typedef callable_helper_ptr<T> type;
};
} //namespace detail
////////////////////////////////////////////////////////////////////////////////
//! defines the various details of a callable object T
////////////////////////////////////////////////////////////////////////////////
template <typename T>
struct callable_traits {
typedef typename detail::callable_helper<T>::type::object_t object_t;
typedef typename detail::callable_helper<T>::type::result_t result_t;
typedef typename detail::callable_helper<T>::type::args_t args_t;
template <unsigned N>
struct arg : public std::tuple_element<N, args_t> {};
};
如果有人有兴趣,我会写下写作背后的过程: http://bkentel.wordpress.com/2012/12/12/defining-a-traits-type-for-callable-objects/