Search code examples
c++templatesnullptr

nullptr as a template parameter


I have a template like:

template <class A, class B>
void func(A* a, B* b){
  ...
}

In some cases it happens that parameter B* b is not needed and therefore, I try to use a nullptr:

MyA a;
func(&a, nullptr);

The compiler doesn't like that since nullptr somehow is not a type.

How can I deal with that situation? The only idea is to just use a dummy type for that case.


Solution

  • The problem is that nullptr is not actually a pointer, but an object of type nullptr_t. So it cannot match either A* or B*. One option would be to provide an overload to specifically handle nullptr_t.

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

    If you also want to allow the first argument to be nullptr, you can provide 2 more overloads. One to handle just the first argument, and one to handle both.

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

    For any more arguments, this approach becomes unfeasible without code generation, as the number of overloads required is an exponential function of the number of arguments. In that case, I would recommend jrok's approach.