繁体   English   中英

nullptr 作为模板参数

[英]nullptr as a template parameter

我有一个模板,如:

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 的方法。

除了Benjamin Lindley建议的重载之外,如果类型AB是指针或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*); 会做的工作。

当您想调用该函数时,您可以执行以下操作而不是其他方式:

    func<a, b>(var_a, nullptr);

通过这样做,您只需将模板传递给函数,您就可以拥有自己的类型

这只是另一种骇人听闻的方法,但它有效:

T* tNullptr = nullptr;
functionWithTemplate(otherArgument1, tNullptr)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM