为nullptr提供模板推导的类型

Mic*_*ael 5 c++ templates nullptr

假设以下代码段:

template <class T>
void fct(T* a, T* b){
  // do something
}

A a;
fct(&a, nullptr); // Problem here!
Run Code Online (Sandbox Code Playgroud)

这使得麻烦,因为调用参数的数据类型的A*,并nullptr_t因此编译器不能推断出模板参数T.

一般来说,我可以想象几个想法如何解决这个问题:

  • 定义A* b = nullptr和使用fct(&a, b)
  • fct为一个nullptr案例定义一个带有一个参数的重载
  • 使用 fct(&a, static_cast<A*>(nullptr))

或者是否有更清晰的解决方案,比如创建类似"typed nullptr"的东西?

MSa*_*ers 6

只需将第二个参数设为非推导上下文,例如:

template <class T>
void fct(T* a, std::remove_reference<T*>::type b) {
Run Code Online (Sandbox Code Playgroud)


Pet*_*etr 2

我还建议以下解决方案:

template <class T, class U>
void fct(T* a, U b){
  T* b2 = b;
  // do something
}

A a;
fct(&a, nullptr); 
Run Code Online (Sandbox Code Playgroud)

这允许更广泛地使用fct,但也许这正是您想要的。

例如,考虑

class A {};
class B : public A {};

...
A a;
B b;
fct(&a, &b); // calls fct<A>
// the following will not compile:
// fct(&b, &a);
Run Code Online (Sandbox Code Playgroud)