c ++ 11:模板参数中的void

时间:2015-09-01 20:57:20

标签: c++ templates c++11 variadic-templates void

我在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变量?

1 个答案:

答案 0 :(得分:3)

  

我是否必须为my_function<void(Input...)> ...

编写部分规范

如上所述,是的。您将调用中的返回值保存在变量中,因此无法解决此问题。但是,你只需以这种方式编写你的function_wrapper,并让operator()简单地返回:

Return operator()() { return somehow_manipulate(input_args); }

即使Returnvoidsomehow_manipulatevoid函数,您也可以编写类似的代码。这就是std::function<R(Args...)>的实施方式。 void没有特殊情况。

  

为什么C ++标准不允许定义void变量?

因为void不是值。 void函数不会返回类型为void某些,它不会返回任何。它没什么特别的。这是空虚。这是佛教的理想。你不能没有什么东西。