将nullptr参数委托给模板代码中的指针重载

vso*_*tco 3 c++ templates nullptr c++11

请考虑以下代码:

#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>();
}
Run Code Online (Sandbox Code Playgroud)

Live on Coliru

如您所见,调用f(nullptr)泛型f(T)中的结果,而不是指针重载f(T*).这很烦人.我知道为什么会发生这种情况:因为nullptr是类型std::nullptr_t,并且通用模板具有更高的过载等级.

如何以直截了当的方式"解决"这个问题?我当然可以写两个不同的实现,一个用于指针,一个用于nullptr_t,然后有一个通用的一个通过一些SFINAE发送到两个中的一个,但这看起来有点太复杂了.

小智 6

最简单的方法可能是实现一个重载void f(std::nullptr_t),并调度到一个指针实现,可以由你选择,假设它为空指针做了正确的事情(无论正确的事情是什么):

void f(std::nullptr_t) { f(static_cast<void *>(nullptr)); }
Run Code Online (Sandbox Code Playgroud)