簡體   English   中英

C ++ 17使用類模板參數在一個包含函數返回值的類型上的Deduction指南

[英]C++17 Using Class Template Argument Deduction guides on a type that holds a function's return value

我設計了一個對象,它接受一個函數及其參數,並將函數的返回值保存在稍后要檢索的對象中。

我的目標是為這個對象創建一個演繹指南,它允許我省略對象構造函數中函數的返回類型。

#include <utility>

template <typename Ret> class footure {
  public:
    template <typename Function, typename... Args>
    explicit footure(Function &&fun, Args &&... args) {
        // ...
        value_ = fun(std::forward<Args>(args)...);
        // ...
    }

    Ret get() { return value_; }

  private:
    Ret value_;
};

int add(const int a, const int b) { return a + b; }

int main() {
    auto f = footure<int>(add, 2, 3); // Remove <int>
    auto r = f.get();
}

我已經查找了這個PR這樣的資源來試圖解決這個問題,但我無法想出一個解決方案。

你似乎在尋找std::invoke_result

template <typename Function, typename... Args>
explicit footure(Function&&, Args&&...) -> footure<std::invoke_result_t<Function&&, Args&&...>>;

不要忘記添加標題<type_traits>

該類必須在編譯時了解FunctionArgs 只有這樣才能推斷出_value的類型, _value所示:

#include <utility>
#include <type_traits>

template <typename Function, typename... Args> class footure {
  public:

    explicit footure(Function &&fun, Args &&... args) {
        // ...
        value_ = fun(std::forward<Args>(args)...);
        // ...
    }

    auto get() { return value_; }


  private:
     typename std::result_of<Function&(Args...)>::type value_;
};

int add(int a, int b) { return a +b; }

int main() {
    auto f = footure(add, 1, 2); // Remove <int>
    auto r = f.get();
}

暫無
暫無

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

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