簡體   English   中英

在C ++ 11中創建並返回包含lambda成員變量的類

[英]Creating and returning a class containing lambda member variable in C++11

我有以下類,其中包含一個lambda成員變量:

template <typename Callable>
class task {
  private:
    Callable lambda;

  public:
    task(Callable l) : lambda(l) {}

    void execute() {
        lambda();
    }
};

現在我想創建一個函數,它接受任何類的對象和該類的成員函數指針,然后創建lambda,從該lambda創建一個任務,最后返回任務。 但我無法弄清楚函數的返回類型:

template <typename C, typename F, typename ...Args>
/* return type ?*/ create_task(C& obj, F func, Args... args) {
    auto l = [&obj, func, args...] {
        (obj.*func)(args...);
    };

    task<decltype(l)> t {l};

    return t;
}

如何在C++11 我也願意接受其他建議,但他們不得不做動態內存分配。

由於類型推導在C ++ 11中如何工作的限制,你必須滾動你自己的可調用而不是使用lambda

template<typename C, typename F, typename... Args>
struct task
{
    C* c;
    F C::* f;
    std::tuple<typename std::decay<Args>::type...> args;

    task(C* c, F C::* f, Args&&... args) 
      : c{c}, f{f}, args{std::forward<Args>(args)...} {}

    void execute()
    {
        auto l = [&](Args&... args) {
            (c->*f)(args...);
        };
        std::apply(l, args);
    }
};

template<typename C, typename F, typename... Args>
auto create_task(C& c, F C::* f, Args&&... args) -> task<C, F, Args...>
{
    return {&c, f, std::forward<Args>(args)...};
}

其中std::apply可以像這樣在C ++ 11中實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM