请考虑以下代码:
#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发送到两个中的一个,但这看起来有点太复杂了。
答案 0 :(得分:6)
最简单的方法可能是实现一个重载void f(std::nullptr_t)
,然后调度到一个指针实现,可以由你选择,假设它为null做了正确的事(无论正确的是什么)指针:
void f(std::nullptr_t) { f(static_cast<void *>(nullptr)); }