Рассмотрим следующий код:Делегат параметр nullptr для перегрузки указателя в коде шаблона
#include <iostream>
template<typename T> // generic
void f(T)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
template<typename T> // overload for pointer types
void f(T*)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
int* p{nullptr};
f(p); // correct delegation to f<T*>();
f(nullptr); // calls f<T>();
}
Как вы можете видеть, вызывая f(nullptr)
результаты в общей f(T)
называют, а не от перегрузки указателя f(T*)
. Это довольно раздражает. Я знаю, почему это происходит: потому что nullptr
имеет тип std::nullptr_t
, а общий шаблон имеет более высокий ранг перегрузки.
Как я могу «решить» эту проблему в простой форме? Я могу, конечно, написать две разные реализации: одну для указателей и одну для nullptr_t
, а затем иметь общий, который отправляет один из двух через некоторый SFINAE, но это выглядит слишком сложно.
Как вы можете ожидать, что перегрузка 'T *' будет вызываться, когда 'std :: nullptr_t' не имеет типа, на который указывает? Я думаю, что вам действительно нужна отдельная логика для этого случая, так что вы можете добавить третью перегрузку. – Brian
@Brian Я не ожидаю, что 'f (T *)' будет вызван, я бы хотел получить это поведение без особых проблем. – vsoftco
Что вы ожидаете от 'T', когда вы вызываете' f (T *) '? – clcto