首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nullptr作为模板参数

nullptr作为模板参数
EN

Stack Overflow用户
提问于 2015-06-07 18:39:23
回答 4查看 5.5K关注 0票数 7

我有一个模板,比如:

代码语言:javascript
复制
template <class A, class B>
void func(A* a, B* b){
  ...
}

在某些情况下,不需要参数B* b,因此,我尝试使用nullptr:

代码语言:javascript
复制
MyA a;
func(&a, nullptr);

编译器不喜欢这样,因为nullptr在某种程度上不是一种类型。

我该如何处理这种情况?唯一的想法就是用一种假人的类型来处理那个案子。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-07 18:49:34

问题是nullptr实际上不是指针,而是nullptr_t类型的对象。因此,它不能与A*B*相匹配。一种选择是提供一个重载来专门处理nullptr_t

代码语言:javascript
复制
template<class A>
void func(A* a, nullptr_t)
{
    func(a, (int*)nullptr);
}

如果还希望允许第一个参数为nullptr,则可以提供另外两个重载。一个只处理第一个参数,另一个处理两个参数。

代码语言:javascript
复制
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的方法。

票数 13
EN

Stack Overflow用户

发布于 2015-06-07 18:51:40

除了Benjamin Lindley建议的重载之外,另一个选项是在AB类型为指针或std::nullptr_t的情况下启用该函数。

代码语言:javascript
复制
#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*);就可以完成这个工作。

票数 3
EN

Stack Overflow用户

发布于 2015-06-07 18:58:38

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

代码语言:javascript
复制
    func<a, b>(var_a, nullptr);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30697131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档