C ++函数透明地获取左值和右值参数

时间:2015-07-16 05:27:58

标签: c++ templates variadic-templates rvalue-reference lvalue

我正在寻找一种方法来进行函数声明,可以将lvalues或rvalues作为参数而不会有太多麻烦。

这个问题Function that accepts both lvalue and rvalue arguments提供了一种有效的解决方法,但需要“手动”实施。例如,一个函数:

void test(T& or T&&);

可以实现为:

void test(T&) { code... }; void test(T&& t) { test(t); };

这个问题是随着参数数量的增加,你必须“手动”输入的声明数量也会以指数方式增加(2 ^ n_parameters)。

所以,对于像这样的函数:

void complex(A& or A&&, B& or B&&, C& or C&&, D& or D&&, E& or E&&);

您必须键入32个不同的签名,这就是问题所在。

我们的想法是,应该能够使用lvalue / rvalue参数的任意组合来调用此函数,例如:

string s("SOMETHING");
complex(string("SOMETHING"), s, "SOMETHING", ...); // SHOULD WORK

但是只声明complex一次并拥有某种自动化流程,可以生成所需的所有其他内容。

这可以通过可变参数模板和某种currying仿真来解决吗?

宏可能吗?或者你怎么看?

1 个答案:

答案 0 :(得分:1)

如果您不需要修改对象,可以通过const引用接受:

void test(T const &);

这将绑定左值和右值。