問題は、それnullptrが実際にはポインタではなく、型のオブジェクトであることですnullptr_t。A*したがって、またはのいずれとも一致しませんB*。1 つのオプションは、具体的に処理するオーバーロードを提供することnullptr_tです。
template<class A>
void func(A* a, nullptr_t)
{
func(a, (int*)nullptr);
}
最初の引数が であることも許可したい場合は、nullptrさらに 2 つのオーバーロードを指定できます。1 つは最初の引数のみを処理し、もう 1 つは両方を処理します。
template<class B>
void func(nullptr_t, B* b)
{
func((int*)nullptr, b);
}
void func(nullptr_t, nullptr_t)
{
func((int*)nullptr, (int*)nullptr);
}
それ以上の引数の場合、必要なオーバーロードの数は引数の数の指数関数であるため、このアプローチはコード生成なしでは実行できなくなります。その場合、jrok のアプローチをお勧めします。