C++ 函数透明地接受左值和右值参数

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

我正在寻找一种方法来进行函数声明,该函数声明可以轻松地将左值或右值作为参数。

这个问题,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 个不同的签名,这就是问题所在。

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

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

但是只声明一次complex,并且有某种自动化过程可以生成所有其他需要的东西。

这可以通过可变参数模板和某种柯里化(Currying)模拟来解决吗?

也许是宏?或者你怎么看?

最佳答案

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

void test(T const &);

这将绑定(bind)到左值和右值。

关于C++ 函数透明地接受左值和右值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31445938/

相关文章:

c++ - 在 OpenGL 中渲染纹理 1 到 1

c++ - 如何将模板类的名称传递给模板参数?

具有模板化参数的 C++ 模板特化

c++ - 为什么 std::stack 不使用模板模板参数?

c++ - 如何定义一个可以保存可变模板参数的类?

c++ - 在 C++ 中从 C 向前声明匿名结构

c++ - 使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 制作动画

c++ - 为类型列表创建别名并将其作为模板参数传递

c++ - 类 x86 系统的 C++11 内存屏障是如何实现的?

C++17 - 可变模板参数 - 使用模板参数调用先前返回值的类方法