我有一些方法,它们采用了一些不同的指针类型。
现在,我想使用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
因为编译器不知道应调用哪种方法。
有没有办法做我想做的事?
像模板专业化一样?
答案 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.