gpt4 book ai didi

c++ - 模棱两可 : Prioritize overloading of f(A&) over f(A)

转载 作者:行者123 更新时间:2023-11-28 01:55:23 25 4
gpt4 key购买 nike

如何优先(告诉编译器)使用“函数接收引用”(#B)而不是“函数接收值”(#A)?

#include <iostream>
using namespace std;

class Heavy{/* ...... */}; //a complex class
Heavy generateHeavy(){
return Heavy();
}
void f(Heavy x){ //#A I want LOW priority.
std::cout<<"case 1: pass by value"<<std::endl;
}
void f(Heavy& x){ //#B I want HIGH priority. (save CPU for big object)
std::cout<<"case 2: pass by reference"<<std::endl;
}

int main() {
//vvvv Here is existing code base that I don't want to touch.
f(generateHeavy()); //compiler call case 1 -> ok (I prefer reference, though)
Heavy heavy;
f(heavy); //should call case 2, but compiler fail (ambiguous) <= question
return 0;
}

这个问题来 self 第一次尝试将 SFINAE 扩展到一个更喜欢通过引用传递的真实案例,如果可能的话。

最佳答案

按字面意思去做的方法是

template <typename T = void>
std::enable_if_t<std::is_same<T, void>::value> f(Heavy x) { ... }

void f(Heavy& x) { ... }

第一个是函数模板,但只允许T = void。第二个不是。在其他条件相同的情况下,非模板优先于模板。


现在,在实际代码中,您可能不会这样做。您将查看您希望支持哪些调用,并找到适合这些调用的更合适的方法。 @StoryTeller 建议 &&:

void f(Heavy &&) { ... }
void f(Heavy &) { ... }

这意味着当你有一个右值时,比如你的函数结果,Heavy && 重载将被调用。这通常没问题,但请注意,它与您要求的并不完全相同:

const Heavy c;
f(c);

您要求的是调用 f(Heavy)。相反,使用 Heavy && 重载时,没有接受它的重载。

额外的重载 void f(const Heavy &) 可以解决这个问题。问题中没有足够的信息来判断这是否适合您的用例,但您应该能够自己弄清楚这一点。

关于c++ - 模棱两可 : Prioritize overloading of f(A&) over f(A),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414312/

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