我在C ++中实现了一些东西,我遇到了一种情况,我不知道如何正确处理。请考虑以下示例
template<typename F>
struct function_wrapper;
template<typename Return, typename... Input>
struct function_wrapper<Return(Input...)>
{
function_wrapper(/*...*/) = /* ... */
std::tuple<Input...> input_args;
Return return_value;
void first_calculate_result() { return_value = somehow_manipulate(input_args); }
Return operator()() { return return_value; }
}
现在,明显的用法是这样的
my_function<int(double)> stored_fnc(5.5);
stored_fnc.first_calculate_result();
/* something maybe else */
std::cout << "Result is: " << stored_fnc() << std::endl;
只要function
的返回类型不是void
,一切都按预期工作。
我的问题是,我是否必须为my_function<void(Input...)>
编写部分规范,我会省略所有Return
内容,还是有更简单的方法?而且,为什么C ++标准不允许我定义void
变量?
答案 0 :(得分:3)
我是否必须为
编写部分规范my_function<void(Input...)>
...
如上所述,是的。您将调用中的返回值保存在变量中,因此无法解决此问题。但是,你只需不以这种方式编写你的function_wrapper,并让operator()
简单地返回:
Return operator()() { return somehow_manipulate(input_args); }
即使Return
为void
且somehow_manipulate
为void
函数,您也可以编写类似的代码。这就是std::function<R(Args...)>
的实施方式。 void
没有特殊情况。
为什么C ++标准不允许定义
void
变量?
因为void
不是值。 void
函数不会返回类型为void
的某些,它不会返回任何。它没什么特别的。这是空虚。这是佛教的理想。你不能没有什么东西。