【发布时间】:2017-09-02 12:58:56
【问题描述】:
考虑一下我有以下几点:
void bar(int a, int b)
{
}
template<typename F, typename... Args>
void foo(F function, Args... args>
{
function(args...);
}
我想有某种方法只将必要数量的参数传递给函数,这样我就可以执行以下操作,这将导致以 1、2 作为参数的 bar 调用被丢弃3. 不知道传入的函数类型 F 需要多少参数。
foo(bar, 1, 2, 3);
foo([](int a, int b){}, 1, 2, 3);
当我尝试使用以下函数特征时:
namespace detail
{
template<typename F, std::size_t... Is, class Tup>
void call_discard_impl(F&& func, std::index_sequence<Is...>, Tup&& tup)
{
std::forward<F>(func)(std::get<Is>(tup)...);
}
}
template<typename F, typename... Args>
void call_discard(F&& func, Args&&... args)
{
detail::call_discard_impl(std::forward<F>(func),
std::make_index_sequence<function_traits<F>::num_args>{},
std::forward_as_tuple(args...));
}
我明白了:
error C2510: 'F': left of '::' must be a class/struct/union
error C2065: '()': undeclared identifier
error C2955: 'function_traits': use of class template requires template argument list
开启:
template <typename F>
struct function_traits : public function_traits<decltype(&F::operator())>
{}
我确实得到了不需要函数特征的成员函数版本:
namespace detail
{
template<typename O, typename R, typename... FunArgs, std::size_t... Is, class Tup>
void call_discard_impl(O* obj, R(O::*mem_func)(FunArgs...), std::index_sequence<Is...>, Tup&& tup)
{
((*obj).*mem_func)(std::get<Is>(tup)...);
}
}
template<typename O, typename R, typename... FunArgs, typename... Args>
void call_discard(O* obj, R(O::*mem_func)(FunArgs...), Args&&... args)
{
detail::call_discard_impl(obj, mem_func,
std::make_index_sequence<sizeof...(FunArgs)>{},
std::forward_as_tuple(args...));
}
【问题讨论】:
标签: c++11 templates lambda callable