nullptr作为模板参数

Mic*_*ael 5 c++ templates nullptr

我有一个模板,如:

template <class A, class B>
void func(A* a, B* b){
  ...
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,B* b不需要参数,因此,我尝试使用nullptr:

MyA a;
func(&a, nullptr);
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢它,因为nullptr某种方式不是一种类型.

我该如何处理这种情况?唯一的想法是在这种情况下使用虚拟类型.

Ben*_*ley 10

问题是它nullptr实际上不是指针,而是类型的对象nullptr_t.因此,它不能匹配任何一种A*B*.一种选择是提供专门处理的过载nullptr_t.

template<class A>
void func(A* a, nullptr_t)
{
    func(a, (int*)nullptr);
}
Run Code Online (Sandbox Code Playgroud)

如果您还想允许第一个参数nullptr,则可以提供2个以上的重载.一个只处理第一个参数,一个处理两个参数.

template<class B>
void func(nullptr_t, B* b)
{
    func((int*)nullptr, b);
}

void func(nullptr_t, nullptr_t)
{
    func((int*)nullptr, (int*)nullptr);
}
Run Code Online (Sandbox Code Playgroud)

对于任何更多的参数,这种方法在没有代码生成的情况下变得不可行,因为所需的重载次数是参数数量的指数函数.在那种情况下,我会推荐jrok的方法.