解决C++中的二义性调用

uqcuzwp8  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个问题,我想通过交换默认参数来重载2个函数,以便在调用中交换它们。

Create(UncachedGraph* graph, std::string name, Node* parent, std::string path = "", int pos = -1);
Create(UncachedGraph* graph, std::string name, Node* parent, int pos = -1, std::string path = "");

但问题是,如果调用它而不向默认参数传递任何参数,则调用是不明确的

Create(this->graph, this->node->getName(), this->node->getParent()); // Create(graph, name, parent) is ambiguous since the overload to be called cannot be resolved

我明白为什么会这样但我真的很想以某种方式解决它,通过某种规则优先考虑一个重载,例如使用一些“魔术限定符”

prioritized Create(UncachedGraph* graph, std::string name, Node* parent, std::string path = "", int pos = -1);
Create(UncachedGraph* graph, std::string name, Node* parent, int pos = -1, std::string path = "");

其在上述调用中将通过调用第一重载或其它来解决歧义。问题是,在这种情况下,我根本不关心调用的是哪个重载,因为它们是一样的。
那么,有没有什么我可以做的事情来解决这个问题?

5t7ly7z5

5t7ly7z51#

但问题是,如果调用它而不向默认参数传递任何参数,则调用是不明确的
好吧,为了解决歧义,其中一个函数声明中的至少一个参数必须在没有默认值的情况下定义:

Create(UncachedGraph* graph, std::string name, Node* parent,  
       std::string path = "", int pos);
Create(UncachedGraph* graph, std::string name, Node* parent,  
       int pos = -1, std::string path = "");

问题是,在这种情况下,我根本不关心调用的是哪个重载,因为它们是一样的。
你可以简单地实现另一个函数的所有默认值来调用另一个函数,并按正确的顺序使用参数:

Create(UncachedGraph* graph, std::string name, Node* parent,  
       int pos = -1, std::string path = "") {
    Create(graph, name, parent, path, pos);
}

相关问题