【问题标题】:Implicitly cast parameter to bool将参数隐式转换为 bool
【发布时间】:2018-07-31 18:04:43
【问题描述】:

前提: 由于宏的潜在问题,我正在尝试创建一个未使用宏实现的定义范围。这是我最初的尝试

//version for if not defined
bool Defined()
{
    return false
}

//version for if defined
bool Defined(bool anything)
{
    return true;
}

还有一个示例用例

if(Defined(_DEBUG))
{
    Stuff...
}

替换

#ifdef _DEBUG
    Stuff...
#endif

#define Defined()         false
#define Defined(Anything) true

好处:
语法更简洁,范围更广,

此代码不是条件代码,因此编译器将能够轻松优化代码段。

问题
这个程序有几个问题,首先是这个帖子的原因。

问题:
您不能将不能隐式转换为布尔值的任何内容传递。有没有办法将任何对象、数字、指针等隐式转换为布尔值?我不相信有,但我想在继续之前确定一下。

【问题讨论】:

  • Car 转换为bool 意味着什么?
  • 只有预处理器知道DEBUG是否是#defined
  • DEBUG未定义时,标记DEBUG扩展为DEBUG,而不是什么都没有
  • 我不明白你为什么想要这个。 if 块和 #ifdef 块通常用于非常不同的目的。
  • 不存在隐式转换。您说的是隐式转换。演员表总是明确的。这是您在源代码中编写的内容,用于告诉编译器进行转换。

标签: c++ casting


【解决方案1】:

您可以使用通用模板:

template<class T>
bool Defined(T &&) { return true; }

【讨论】:

  • t 可以删除以消除“未使用参数”警告。
  • 虽然这回答了所提出的字面问题,但请注意它不会达到最终目标。如果定义了DEBUG,它可能定义为空,这将调用Derived()。如果未定义,Defined(DEBUG) 使用可能未定义的标识符 DEBUG
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多