【问题标题】:Can I generate a function without providing arguments?我可以在不提供参数的情况下生成函数吗?
【发布时间】:2019-03-04 19:23:34
【问题描述】:

所以std::function Deduction Guides 所以给定:

int foo();

我能做到:

std::function bar(foo);

但我被困在 编译器上。在那里我必须做更多类似的事情:function<int()> bar(foo)。我想知道是否有一种方法可以创建 std::function 而不传递函数指针 显式提供函数签名?因此,例如make_pair 将从它的参数中推断出它的返回类型。我想知道即使使用,我是否可以为functions 写类似的东西,比如:

auto bar = make_function(foo);

这可行吗?

注意:我的真实情况是foo 是一个模板函数,其中包含很多我不想推断的参数。所以我的动机是生成一个function 而不需要提供参数类型。

Live Example

【问题讨论】:

  • 在您的实际情况下,std::function bar(foo)c++17 中不起作用。请在法​​律c++17 中提供您想要做的实际minimal reproducible example,并要求在c++14 中实现类似的东西。
  • @Yakk-AdamNevraumont 我不确定你说它不起作用是什么意思……我已经添加了一个例子:耸耸肩:
  • “我的真实案例是 foo 是一个带有很多参数的模板函数” - 你的“minimal reproducible example”与你的真实用例根本不同,@ 987654332@。在编写minimal reproducible example 时,从真实用例 开始,然后最小化。不要首先最小化。
  • @Yakk-AdamNevraumont 所以this is my original question。你可以在底部看到我的答案。我在评论中的意思是寻求一种生成function 的方法,这可以通过我仅传递一个函数指针来完全定义。我以为这很清楚?我的编辑对你有用吗?
  • @Yakk-AdamNevraumont 我要从您的编辑中得知您正在确认我们现在的情况?

标签: c++17 c++14 c++14 c++ function c++14 c++17 template-argument-deduction


【解决方案1】:

您的问题在细则的最后有一些最重要的部分。如果您的 foo 是一个模板,那么 C++17 演绎指南将无法帮助您使用简单的语法,例如

std::function f(foo);

您仍然需要为foo 提供模板参数。假设你可以指定 foo 的参数类型(你必须这样做),编写 make_func 是一个简单的练习:

 template<class R, class... ARGS>
 auto make_func(R (*ptr)(ARGS...)) {
      return std::function<R (*)(ARGS...)>(ptr);
 }

比你使用它:

auto bar = make_func(&foo<Z, Y, Z>);

【讨论】:

  • 我接受,因为这是 C++14 上的天才解决方案。但是我很生气地说这仍然不适用于 Visual Studio 2017 版本 15.6.7:ideone.com/T52Gxn 我收到此错误:“错误 C2039:result_type:不是全局命名空间的成员”时我尝试使用make_func 来获取enable_if_t 中的返回类型。我将打开一个新问题,看看是否有解决方法...
  • 如果您有任何建议,我已经在这里询问了我的跟进:stackoverflow.com/q/55047417/2642059
  • 请注意,我需要一个函数来返回std::funciton,以便提取返回类型。这是一个很棒的答案,对于给定的问题应该被接受。但是,如果您的兴趣与我的兴趣更接近,我将基于 C++14 的答案:stackoverflow.com/a/55050902/2642059
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2017-10-30
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多