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的方法.
归档时间: |
|
查看次数: |
2633 次 |
最近记录: |