如何用文字0和指针解决对重载函数的调用歧义

mfy*_*fya 10 c++ templates overloading overload-resolution

我很确定这一定已经在这里了,但是我没有找到很多关于如何解决这类问题的信息(没有在电话上强制转换):

给定两个重载,我希望一个带有文字0的函数的调用总是调用unsigned int版本:

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

void func( void * ) {
    cout << "void *" << endl;
}

func( 0 ); // error: ambiguous call
Run Code Online (Sandbox Code Playgroud)

我明白为什么会这样,但我不想一直写func(0u)甚至func(static_cast(0)).所以我的问题是:

1)是否有推荐的方法来执行此操作?

2)以下方式进行操作是否有任何问题,这是什么原因?

void func( unsigned int ) {
    cout << "unsigned int" << endl;
}

template <typename T>
void func( T * ) {
    static_assert( std::is_same<T, void>::value, "only void pointers allowed" );
    cout << "void *" << endl;
}

func( 0 ); // calls func( unsigned int )!
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 1

1)一般有推荐的方法吗?

是的,我会像你在 2) 中那样做。我不认为 2) 有效的原因有任何更深层次的含义。类型int根本不匹配T*,因此无法找到T。因此它将忽略该模板。