Я почти уверен, что это уже должно быть здесь, но я не нашел много информации о том, как решить эту проблему (без преобразования вызова):
Учитывая две перегрузки, я хочу, чтобы вызов с функцией с литералом 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 )!