c++ - nullptr 作为模板参数

标签 c++ templates nullptr

我有一个像这样的模板:

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/

相关文章:

c++ - 从 std::vector<unsigned> 映射到 Eigen::VectorXi

c++ - 使用带有 INSERT_VALUES 的 MatSetValuesStencil 替换整行

asp.net-mvc - Asp.Net MVC 中的设计器友好 View

c++ - 空 shared_ptr 的语义

c++ - BOOST_PP_SEQ_ENUM 空序列

c++ - 调用模板方法导致 'operator<' 不匹配

css - 在 CSS 中使用模板

c++ - 我可以将 nullptr 存储到 bool 中吗?

c++ - 检查 nullptr 100% 是否可以防止有关内存布局的段错误?

c++ - 在没有悬挂指针的情况下返回 C++ 中的抽象数据类型