用nullptr调用重载方法不明确

时间:2018-08-28 10:55:24

标签: c++ overloading nullptr

我有一些方法,它们采用了一些不同的指针类型。
现在,我想使用nullptr作为参数来调用一个特定的方法。

我知道我可以将nullptr强制转换为特定类型的指针,而我希望它调用的方法需要使用。
但我不想/不能投射nullptr

这个例子应该解释我要做什么:

class Foo {
    //some attributes
};
class Bar {
    //some attributes
};

void myMethod (Foo*) {
    //I want this method to be called
}
void myMethod (Bar*) {
    //Not this one
}

int main () {
    myMethod(nullptr);              //Something like this
//  myMethod(static_cast<nullptr>); //I don't want to write this.

    return 0;
}

如果我只用nullptr调用它,就会得到
error: call of overloaded 'myMethod(std::nullptr_t)' is ambiguous
因为编译器不知道应调用哪种方法。

有没有办法做我想做的事?
像模板专业化一样?

4 个答案:

答案 0 :(得分:5)

您可以创建一个以std::nullptr_t作为参数的重载,然后在其中调用所需的确切函数(通过强制转换):

void myMethod(std::nullptr_t)
{
    myMethod(static_cast<Foo*>(nullptr));
}

答案 1 :(得分:3)

Some programmer dude有一个很好的建议,但是如果您愿意在不传递nullptr的情况下调用它,也可以向其中一个方法添加默认参数,例如:

void myMethod (Foo* = nullptr) {}
void myMethod (Bar*) {}

int main () {
    myMethod();
}

答案 2 :(得分:3)

您可以创建Foo和Bar的指针,并让它们都指向nullptr。现在,您可以通过将指针变量作为参数来调用重载函数。

class Foo {
    //some attributes
};
class Bar {
    //some attributes
};

void myMethod (Foo*) {
    //I want this method to be called
}
void myMethod (Bar*) {
    //Not this one
}

int main () {
    Foo* foo=nullptr;
    Bar* bar=nullptr;
    myMethod(foo);              //This will call myMethod(Foo*)

    return 0;
}

答案 3 :(得分:2)

  

喜欢类似于模板专业化的东西吗?

如果这意味着您希望根据情况指定目标类,则可以将@Some programmer dude's answer中的重载转换为模板。

template<class C>
void myMethod(std::nullptr_t) {
    myMethod(static_cast<C*>(nullptr));
}

现在,您可以使用简单的模板名称来调用所需的重载

myMethod<Foo>(nullptr); // What you want now.
myMethod<Bar>(nullptr); // What you may want at another point.
myMethod<Baz>(nullptr); // What you may want sometime in the future,
                        // after adding another overload.