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); }
即使 Return
是 void
并且 somehow_manipulate
是 void
函数,您也可以编写这样的代码。 std::function<R(Args...)>
就是这样实现的。 void
.
没有特殊情况
why C++ standard does not allow to define void
variables?
因为void
不是一个值。 void
函数没有 return 类型 void
的东西,它没有 return 任何东西。这是独一无二的。它是空的。这是佛教的理想。你不能一无所有。
我正在用 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); }
即使 Return
是 void
并且 somehow_manipulate
是 void
函数,您也可以编写这样的代码。 std::function<R(Args...)>
就是这样实现的。 void
.
why C++ standard does not allow to define
void
variables?
因为void
不是一个值。 void
函数没有 return 类型 void
的东西,它没有 return 任何东西。这是独一无二的。它是空的。这是佛教的理想。你不能一无所有。