gpt4 book ai didi

c++ - 右值函数重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:37 27 4
gpt4 key购买 nike

我想重载一个函数,以便它以某种方式操纵它的参数,然后返回对参数的引用——但如果参数不是可变的,那么它应该返回一个被操纵的拷贝相反的论点。在弄乱它很长时间之后,这就是我想出的。

using namespace std;

string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}

string foo(string &&in)
{
return move(foo(in));
}

string foo(const string& in)
{
return foo(string(in));
}

这段代码似乎可以正常工作,但我很想知道是否有人能想出更好的方法。

这是一个测试程序:

int main(void)
{
string var = "world";
const string var2 = "const world";
cout << foo(var) << endl;
cout << var << endl;

cout << foo(var2) << endl;
cout << var2 << endl;

cout << foo(var + " and " + var2) << endl;
return 0;
}

正确的输出是

hello world
hello world
hello const world
const world
hello hello world and const world

我想如果我能这样做会稍微整洁一些:

string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}

string foo(string in)
{
return move(foo(in));
}

当然,这是行不通的,因为大多数对 foo 的函数调用都是不明确的——包括 foo 本身的调用!但是如果我能以某种方式告诉编译器优先考虑第一个...

正如我所说,我发布的代码工作正常。我不喜欢的主要是重复的额外代码。如果我有一堆这样的功能,它会变得一团糟,而且其中大部分会非常重复。因此,作为我的问题的第二部分:任何人都可以想出一种方法来自动生成第二个和第三个 foo 函数的代码吗?例如

// implementation of magic_function_overload_generator
// ???

string& foo(string &in);
magic_function_overload_generator<foo>;

string& bar(string &in);
magic_function_overload_generator<bar>;

// etc

最佳答案

我会一起摆脱引用,只写一个按值传递和返回的函数:

std::string foo(std::string in)
{
in.insert(0, "hello ");
return in;
}

如果你传递一个左值,输入的字符串将被复制。如果您传递一个右值,它将被移动。

当离开函数时,命名返回值优化可能会开始,所以返回基本上是空操作。如果编译器决定反对,结果将被移动(即使 in 是左值)。

右值引用的好处在于,您必须较少考虑将引用放在用户代码中的何处以获得效率。对于可移动类型,按值传递实际上是最有效的。

关于c++ - 右值函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6368690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com