lambda的模板参数推导

Axi*_*rse 8 c++ lambda templates c++11 c++14

我正在尝试创建一个辅助函数,如果给定的weak_ptr有效,则在调用时执行lambda/std :: function.目前以下代码有效,但不幸的是,它需要我定义模板参数.我正在寻找一种方法来实现自动模板参数推导.

template <typename DependentType, typename... ArgumentTypes>
auto make_dependent(std::weak_ptr<DependentType>& dependent, std::function < void(ArgumentTypes...)> functor) -> decltype(functor)
{
    return [&dependent, functor] (ArgumentTypes... args)
    {
        if (!dependent.expired()) {
            functor(args...);
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想std::function <void(ArgumentTypes...)>用通用模板参数替换FunctorType,但后来我不确定如何从中提取参数FunctorType.上面的代码有效,下面的代码是理论上的:

template <typename DependentType, typename FunctorType>
auto make_dependent_ideal(std::weak_ptr<DependentType>& dependent, FunctorType functor) -> decltype(std::function<return_value(functor)(argument_list(functor))>)
{
    return[&dependent, functor](argument_list(functor) args)
    {
        if (!dependent.expired()) {
            functor(args...);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做这样的事情?

Yak*_*ont 5

从参数中提取参数来解决问题的最简单方法是不从参数中提取参数.

template<typename F, typename C>
struct conditional_forwarder {
  F func;
  C cond;
  template<typename Fin, typename Cin>
  conditional_forwarder( Fin&& f, Cin&& c ):
    func(std::forward<Fin>(f)), cond(std::forward<Cin>(c)) {}
  template<typename... Args>
  void operator()( Args&&... args ) const {
    if (cond())
      func( std::forward<Args>(args)... );
  }
};
template<typename F, typename C>
conditional_forwarder< typename std::decay<F>::type, typename std::decay<C>::type >
make_conditional_forwarder( F&& f, C&& c ) {
  return {std::forward<F>(f), std::forward<C>(c)};
}
// todo: make_dependent_test   

template <typename DependentType, typename FunctorType>
auto make_dependent_ideal(std::weak_ptr<DependentType>& dependent, FunctorType functor)
  -> decltype(make_conditional_forwarder( make_dependent_test(dependent), functor) )
{
  return make_conditional_forwarder( make_dependent_test(dependent), functor);
}
Run Code Online (Sandbox Code Playgroud)

在C++ 14中,大部分内容都会更容易.

顺便说一句,似乎有一个基本的设计缺陷:条件转发也许应该AQUIRE一.lock()weak_ptr,然后执行functor该锁内,这样的前提(即资源被持有)适用于整个呼叫functor.

weak_ptr当a的远程状态weak_ptr可以被复制时,我也不确定你为什么要持有a的引用.

在C++ 14中,您可以返回以下内容:

return [=](auto&&... args) mutable {
}
Run Code Online (Sandbox Code Playgroud)

我相信,这些decltype东西也会消失,因为功能可以更容易地推断出它们的返回类型.