我有一个模板,比如:
template <class A, class B>
void func(A* a, B* b){
...
}在某些情况下,不需要参数B* b,因此,我尝试使用nullptr:
MyA a;
func(&a, nullptr);编译器不喜欢这样,因为nullptr在某种程度上不是一种类型。
我该如何处理这种情况?唯一的想法就是用一种假人的类型来处理那个案子。
发布于 2015-06-07 18:49:34
问题是nullptr实际上不是指针,而是nullptr_t类型的对象。因此,它不能与A*或B*相匹配。一种选择是提供一个重载来专门处理nullptr_t。
template<class A>
void func(A* a, nullptr_t)
{
func(a, (int*)nullptr);
}如果还希望允许第一个参数为nullptr,则可以提供另外两个重载。一个只处理第一个参数,另一个处理两个参数。
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的方法。
发布于 2015-06-07 18:51:40
除了Benjamin Lindley建议的重载之外,另一个选项是在A和B类型为指针或std::nullptr_t的情况下启用该函数。
#include <type_traits>
template<typename T>
struct is_pointer : std::integral_constant<bool,
std::is_pointer<T>::value ||
std::is_same<T, std::nullptr_t>::value
>
{};
template <class A, class B>
typename std::enable_if<
is_pointer<A>::value && is_pointer<B>::value
>::type
func(A a, B b) { }但是有时候最简单的是最好的,所以也许第二个过载的template<class A> func(A*);就可以完成这个工作。
发布于 2015-06-07 18:58:38
当您想要调用该函数时,可以执行以下操作,而不是其他方法:
func<a, b>(var_a, nullptr);通过这样做,您只需将模板传递给函数,就可以拥有自己的类型。
https://stackoverflow.com/questions/30697131
复制相似问题