C++ 函数透明地接受左值和右值参数
C++ Function taking lvalue and rvalue parameters transparently
我正在寻找一种方法来进行函数声明,可以轻松地将左值或右值作为参数。
这个问题 Function that accepts both lvalue and rvalue arguments 提供了一种可行但需要实施的解决方法 "manually"。例如一个函数:
void test(T& or T&&);
可以实现为:
void test(T&) { code... }; void test(T&& t) { test(t); };
问题在于,随着参数数量的增加,您必须键入的声明数量 "manually" 也会以指数方式增加,令人遗憾的是 (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
一次,并且有某种自动化过程可以生成所需的所有其他内容。
这可以通过可变参数模板和某种柯里化仿真来解决吗?
也许是宏?或者你怎么看?
如果不需要修改对象,可以简单地通过const引用接受:
void test(T const &);
这将绑定到左值和右值。
我正在寻找一种方法来进行函数声明,可以轻松地将左值或右值作为参数。
这个问题 Function that accepts both lvalue and rvalue arguments 提供了一种可行但需要实施的解决方法 "manually"。例如一个函数:
void test(T& or T&&);
可以实现为:
void test(T&) { code... }; void test(T&& t) { test(t); };
问题在于,随着参数数量的增加,您必须键入的声明数量 "manually" 也会以指数方式增加,令人遗憾的是 (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
一次,并且有某种自动化过程可以生成所需的所有其他内容。
这可以通过可变参数模板和某种柯里化仿真来解决吗?
也许是宏?或者你怎么看?
如果不需要修改对象,可以简单地通过const引用接受:
void test(T const &);
这将绑定到左值和右值。