C++ 函数透明地采用左值和右值参数

Posted

技术标签:

【中文标题】C++ 函数透明地采用左值和右值参数【英文标题】:C++ Function taking lvalue and rvalue parameters transparently 【发布时间】:2015-07-16 05:27:58 【问题描述】:

我正在寻找一种方法来制作可以将左值或右值作为参数而没有太多麻烦的函数声明。

这个问题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 并拥有某种自动化流程来生成所需的所有其他内容。

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

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

【问题讨论】:

而且你不使用const是因为你想修改对象(而且你不在乎它是否被赋予了一个很快就会死掉的临时对象)? @MattMcNabb 我不想修改这些对象,但我需要获取引用,因为(对于我的特定场景)函数获取的对象已删除其复制构造函数。 如果您不想修改对象,只需使用 const 引用即可。它们绑定到左值和右值。 @MattMcNabb 哦,我不知道。试过了……有效。您介意将其作为答案,以便我给您加分吗?谢谢,最好的。 这可能是 Boost.Preprocessor(可能与模板结合使用)的好地方。 【参考方案1】:

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

void test(T const &);

这将绑定到左值和右值。

【讨论】:

以上是关于C++ 函数透明地采用左值和右值参数的主要内容,如果未能解决你的问题,请参考以下文章

左值和右值的区别

左值和右值上的 C++ std::is_integral 显示不同的结果

c++中的左值和右值,右值引用到底是啥?关于引用这一节看得很迷糊。

C++:神一样的左值

后缀(前缀)增量、左值和右值(在 C 和 C++ 中)

左值和右值