【问题标题】:Extracting return type from function template type从函数模板类型中提取返回类型
【发布时间】:2015-01-16 20:36:33
【问题描述】:

我有一个类似于以下的包装函数:

template<typename Func, typename ... Args>
void func(Func f, Args ... args) {
  ...
  f(args...);
  ...
}

是否可以在编译时从类型Func中提取返回类型?

例如,用户有代码并以如下方式调用func

template<typename T>
T add(const T& l, const T& r) {
  return l + r;
}

int main(int argc, char** argv) {
  double a = 4.5, b = 5.5;
  func(add<double>, a, b);
  return 0;
}

我们能否在func 的调用中推断出一个函数被传递给它并返回一个double?我想将返回类型信息用于func 中的其他内容。

【问题讨论】:

标签: c++ templates c++11


【解决方案1】:

以下任何一个都应该有效

using result_type = decltype(std::declval<Func>()(std::declval<Args>()...));

using result_type = typename std::result_of<Func(Args...)>::type;

Live demo

【讨论】:

  • 漂亮,谢谢。作为回应,如果我有一个返回类型为void 的函数并且在func 中有return f(args...);(显然更改func 的返回类型以使用您的建议),这会是一个问题吗?
  • 看起来不是编译问题! coliru.stacked-crooked.com/a/fcebfa729e050c95
  • @AlexBrooks 不,没问题,works just fine。您还应该查看通用参考完美转发(搜索这些术语,有几个答案处理它们)
【解决方案2】:

从 c++17 开始是 std::invoke_result:

using result_type = typename std::invoke_result_t<Func(Args...)>;

【讨论】:

    【解决方案3】:

    如果您可以访问 C++14,或者只是出于好奇,请尽量不要提交特定类型。 以下代码使用通用 lambda 并为您推导出类型。 在许多情况下,我发现它更容易使用。

    #include <iostream>
    using namespace std;
    
    template<typename Func, typename ... Args>
    void func(Func&& f, Args ... args) {
      return;
    }
    
    auto add = [](auto l, auto r) { return l * r; };
    
    int main() 
    {
        auto a = double{4.5};
        auto b = double{5.5};
        func(add, a, b);
        return 0;
    }
    

    Ideone: http://ideone.com/wXnc0g

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2016-07-20
      • 2022-01-09
      相关资源
      最近更新 更多