Вызов перегруженного метода с nullptr неоднозначен - PullRequest
0 голосов
/ 28 августа 2018

У меня есть несколько перегруженных методов, которые принимают разные типы указателей.
Теперь я хочу вызвать один конкретный метод с 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 голосов
/ 28 августа 2018

Нравится что-то похожее на шаблонную специализацию?

Если это означает, что вы хотите указать целевой класс для каждого конкретного случая, вы можете превратить перегрузку в @ Ответ какого-то программиста в шаблон.

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.
0 голосов
/ 28 августа 2018

У некоторых программистов чувак есть хорошее предложение, но вы также можете добавить параметр по умолчанию к одному из ваших методов, если вы были рады вызвать его без передачи nullptr, например:

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

int main () {
    myMethod();
}
0 голосов
/ 28 августа 2018

Вы можете создать указатель 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;
}
0 голосов
/ 28 августа 2018

Вы можете создать перегрузку, которая будет принимать std::nullptr_t в качестве аргумента, а затем вызывать нужную функцию (путем приведения):

void myMethod(std::nullptr_t)
{
    myMethod(static_cast<Foo*>(nullptr));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...