【问题标题】:Pass a function returning void to a function accepting void? [closed]将返回 void 的函数传递给接受 void 的函数? [关闭]
【发布时间】:2012-07-30 12:10:05
【问题描述】:

所以,在摆弄了一段时间之后,我无法得到它......为什么这还不是标准的一部分?

template<class T> accept_all(T) {}
void give_void() {}
int give_int() { return 1;}

int main() {
accept_all(give_void());
accept_all(give_int());
}

使用模板类特化可以省去很多麻烦...而且就一般语法而言,能够返回一个 void 而不能传递一个是没有意义的。

有没有什么我可以做的而不涉及为每种方法类型专门设置一个丑陋的“中介类”来调用这个东西?

谢谢。

编辑: 那么,什么是实现接受任何函数返回值的模板的好方法呢?

【问题讨论】:

  • 为什么要实现一个接受任何函数返回值的函数?
  • 一个问题是void 不是一个值,它根本不是一个值。如果您查看give_void,它没有返回任何内容。

标签: c++


【解决方案1】:

我觉得它看起来很奇怪。为什么不连续调用这些函数:

give_void();
accept_void();

更干净。

实际上,您输入accept_void(give_void()); 并没有节省任何费用,即使您需要输入的符号数量是相同的。

编辑不确定我是否真的了解您想要实现的目标,但是:

template <typename Result, typename Callable>
static Result func(Callable c)
{
    return c();
}

【讨论】:

  • @user1240436:请看我的编辑
【解决方案2】:

C++ 允许您从函数中return void(参见Is returning void valid code?)。

但是,返回 void 与接受 void 明显不同;请注意,int foo(void) 只是 int foo() 的替代(且已弃用)语法,仅出于与 C 兼容的历史原因而存在。

您的建议打破了函数调用中的参数数量与函数接受的参数数量相同的不变量。

【讨论】:

  • 标准令人困惑(一如既往)。我的生活会更简单,如果传递一个 void 永远不会是一个“真实”的论点,而是一个表达假人的语法工具。我在让代理模板类处理特殊情况和只启用 void 参数作为模板语法扩展的语言之间有点纠结。
猜你喜欢
  • 2021-11-19
  • 2016-07-02
  • 2018-08-27
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多