【问题标题】:Template function to check if a smart pointer is null检查智能指针是否为空的模板函数
【发布时间】:2018-04-27 05:23:17
【问题描述】:

为了解决这个问题,我有一个带有参数的宏,并使用-> 在其上调用方法。

我想扩展它来检查 null,但发现人们已经在使用它和智能指针,其中一些不支持转换为 bool。

其中一些智能指针有不同名称的空值检查方法,我无法访问所有使用它的代码,所以我需要一个通用的解决方案。

我正在考虑将宏转发到某个模板函数,但我不确定如何完全通用。

【问题讨论】:

  • 为什么要有一个宏转发给一个函数?为什么不只是一个函数?
  • 因为它是一个日志宏,可以获取__FILE__等,避免在禁用日志时计算日志输出。我现在也不能改变它(因此问题)
  • 是否可以为 bool 情况编写一个模板并为“特殊”智能指针编写更具体的模板? IE。对于每种特殊的有效性检查方法,是否只有一个模板或类型?否则我认为必须使用一些 SFINAE。
  • 库中定义并使用了两个智能指针,但库的用户可能会使用他们自己的智能指针,我希望有一个完全通用的解决方案。跨度>

标签: c++ c++03


【解决方案1】:

如果它与-> 一起使用,并且通过返回内部指针的operator-> 工作,那么也许您可以将它与NULL 进行比较:

if(ptr.operator->() == NULL) throw std::invalid_argument("The pointer points to nowhere");

好的,所以如果“智能指针”返回“智能指针”,我们需要更深入:

template<typename T> bool isNull(T *t) { return t == NULL; }
template<class T> bool isNull(T const &t) { return isNull(t.operator->()); }

可怕而有效(但需要 const 限定的 operator-&gt; 重载。

【讨论】:

  • 这很有趣,但是 operator-> 本身可以返回另一个智能指针,对吧?我想我们必须递归?
  • 然后是一个模板化函数,它与 NULL 普通指针进行比较,并更深入地了解其他类型。
  • 实际上,在“空”智能指针上调用operator-&gt; 是否“安全”?
  • 这个星球上没有什么是真正安全的。究竟是什么让你感到不安?
  • 我的意思是,在实践中,当您调用operator-&gt; 时,智能指针实现是否会产生未定义的行为,而它们是“NULL”?通常你只是使用-&gt;,然后如果它为空的话真的很糟糕,但我之前没有在这种情况下考虑过它。 ...我认为我们自己的智能指针可能在它们的重载中有断言。呃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多