【问题标题】:c++ generic programming with templates and nullptr带有模板和 nullptr 的 c++ 泛型编程
【发布时间】:2014-06-26 08:58:43
【问题描述】:

假设我有这个通用函数:

template<typename T>
void foo(T data) {
  if(data == nullptr)
   return;
  //...
}

问题是我不能真正写出那样的东西。如果 T 是原始类型或值传递的对象,我无法将其与 nullptr 进行比较。

另一方面,如果 T 是一个指向 int 的指针呢?我希望能够将它与 nullptr 进行比较。

有什么办法吗?

【问题讨论】:

  • 将模板改为foo(T * data)
  • 我想过,但我想要普通值和指针作为 T。也许我所要求的无法完成(就像在 Java 中一样)。问题是如果我将 T 设置为 int* 之类的值,我的编译器会接受对 foo(nullptr) 的调用而不会抱怨。它应该阻止我这样做吗?
  • 你想要if (data == T{}) 吗?
  • 对不起,我不知道那个表达的意思。我希望类类型和指针类型都可以绑定到 T。问题是我无法将类类型(值)与 nullptr 进行比较。
  • @Kami:不清楚你想做什么。 (我对你为什么认为编译器应该阻止你调用foo&lt;int*&gt;(nullptr); 感到特别困惑——你为什么认为它应该阻止你?)如果你想要foo() 的两个版本,一个将采用指针类型和测试它们针对nullptr 和一个将采用非指针类型(而不是再次测试它们nullptr),然后您可以制作2 个重载函数模板。

标签: c++ templates generic-programming nullptr


【解决方案1】:

正如@j_random_hacker 建议的那样,只需重载 foo() 函数。这样,根据传递给 foo() 的类型,您有 2 种不同的行为

template<typename T>
void foo(T *data)
{
  if(data == nullptr)
    return;
  //...
}

template<typename T>
void foo(T data)
{
  //...
}

【讨论】:

  • 好吧,这可能是最简单的方法了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多