Как разрешить неоднозначность вызова перегруженной функции с литералом 0 и указателем

Я почти уверен, что это уже должно быть здесь, но я не нашел много информации о том, как решить эту проблему (без преобразования вызова):

Учитывая две перегрузки, я хочу, чтобы вызов с функцией с литералом 0 всегда вызывает версию unsigned int:

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

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

func( 0 ); // error: ambiguous call

Я понимаю, почему это происходит, но я не хочу постоянно писать 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 )!
10
задан mfya 5 January 2011 в 23:59
поделиться