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

c++11: void in template arguments

我正在用 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 的 return 类型不是 void

我的问题是,我是否必须为 my_function<void(Input...)> 编写部分规范,我会在其中省略所有 Return 内容,还是有更简单的方法?此外,为什么 C++ 标准不允许我定义 void 变量?

do I have to write partial specification for my_function<void(Input...)>...

正如所写,是的。您正在将调用中的 return 值保存在一个变量中,因此没有办法解决这个问题。但是,您可以简单地 而不是 那样写 function_wrapper,而 operator() 只需 return:

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

即使 Returnvoid 并且 somehow_manipulatevoid 函数,您也可以编写这样的代码。 std::function<R(Args...)> 就是这样实现的。 void.

没有特殊情况

why C++ standard does not allow to define void variables?

因为void不是一个值。 void 函数没有 return 类型 void 的东西,它没有 return 任何东西。这是独一无二的。它是空的。这是佛教的理想。你不能一无所有。