我有一个像这样的模板:
template <class A, class B>
void func(A* a, B* b){
...
}
在某些情况下,不需要参数 B* b
,因此,我尝试使用 nullptr:
MyA a;
func(&a, nullptr);
编译器不喜欢这样,因为 nullptr
不知何故不是一种类型。
我该如何处理这种情况?唯一的想法是在这种情况下只使用虚拟类型。
最佳答案
问题是nullptr
实际上不是一个指针,而是一个nullptr_t
类型的对象。所以它不能匹配 A*
或 B*
。一种选择是提供重载以专门处理 nullptr_t
。
template<class A>
void func(A* a, nullptr_t)
{
func(a, (int*)nullptr);
}
如果您还想允许第一个参数为 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);
}
对于任何更多的参数,这种方法在没有代码生成的情况下变得不可行,因为所需的重载数量是参数数量的指数函数。在这种情况下,我会推荐 jrok 的方法。
关于c++ - nullptr 作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697131/