【发布时间】:2013-09-10 16:08:01
【问题描述】:
有时您希望函数返回多个值。一种非常常见的方法 在 C++ 中实现这样的行为是通过非常量引用传递您的值,并且 在你的函数中分配给他们:
void foo(int & a, int & b)
{
a = 1; b = 2;
}
你会使用哪个:
int a, b;
foo(a, b);
// do something with a and b
现在我有一个函子可以接受这样的函数并希望转发 将参数设置为另一个返回结果的函数:
template <typename F, typename G>
struct calc;
template <
typename R, typename ... FArgs,
typename G
>
struct calc<R (FArgs...), G>
{
using f_type = R (*)(FArgs...);
using g_type = G *;
R operator()(f_type f, g_type g) const
{
// I would need to declare each type in FArgs
// dummy:
Args ... args;
// now use the multiple value returning function
g(args...);
// and pass the arguments on
return f(args...);
}
};
这种方法是否有意义,或者我应该使用基于元组的 方法?这里有比基于元组的方法更聪明的方法吗?
【问题讨论】:
-
我想这取决于用例。使用
std::tuple似乎更容易。您也可以使用std::tuple作为持有者,并且仍然使用其成员来保持f和g原样。如果您需要这方面的帮助,请告诉我,我可以发布一些内容。 -
我真的不喜欢通过引用函数参数返回值的方法——返回一个元组(你可能会得到一些 RVO 或 r 值引用)。
-
@DanielFrey 我已经对
std::tuple添加了一个非常幼稚的更改,但我仍然对至少让f保持不变以便能够使用定义在标准命名空间。我同意按照 Dieter Lücking 的论证,为我的生成器返回std::tuple确实有意义。 -
在第一个更简单的示例中,通常您只需创建一个 a、b 的结构并返回该结构,而不是传递内部修改的 refs。您能否将这个想法扩展到您的模板函数 - 将返回类型设为模板 arg 并在调用它时从仿函数返回值。
-
同意 Deiter - 更改 ref 的值可能会让您所在班级的用户感到惊讶。