C++ 隐式地将参数强制转换为bool

C++ 隐式地将参数强制转换为bool,c++,casting,C++,Casting,前提: 由于宏可能存在问题,我试图创建一个不使用宏实现的定义范围。这是我的初步尝试 //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

前提: 由于宏可能存在问题,我试图创建一个不使用宏实现的定义范围。这是我的初步尝试

//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

好处:
语法更清晰,范围更广,

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

问题
这个程序有几个问题,第一个是这个帖子的原因

问题:

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

您可以使用通用模板:

template<class T>
bool Defined(T &&) { return true; }
模板
bool定义的(T&){return true;}

您可以使用通用模板:

template<class T>
bool Defined(T &&) { return true; }
模板
bool定义的(T&){return true;}

汽车
转换为
bool
意味着什么?只有预处理器知道
调试
是否定义了
调试
未定义时,令牌
调试
扩展为
调试
,我不明白您为什么要这样做
if
块和
#ifdef
块通常有非常不同的用途。没有隐式强制转换。你说的是隐式转换。演员阵容总是明确的。这是你在源代码中编写的东西,用来告诉编译器进行转换。将
Car
转换为
bool
意味着什么?只有预处理器知道
DEBUG
是否定义了
。当
DEBUG
未定义时,标记
DEBUG
扩展为
DEBUG
,我不明白你为什么想要这个
if
块和
#ifdef
块通常有非常不同的用途。没有隐式强制转换。你说的是隐式转换。演员阵容总是明确的。这是您在源代码中编写的,用于告诉编译器进行转换。
t
可以删除,以消除“未使用的参数”警告。虽然这回答了所问的字面问题,但请注意它不会达到最终目标。如果定义了
DEBUG
,它很可能被定义为空,这将调用
Derived()
。如果它没有定义,
defined(DEBUG)
使用一个可能未定义的标识符
DEBUG
t
可以删除,以消除“unused parameter”警告。虽然这回答了所问的字面问题,但要注意它不会达到最终目标。如果定义了
DEBUG
,它很可能被定义为空,这将调用
Derived()
。如果它没有定义,
defined(DEBUG)
使用一个可能未定义的标识符
DEBUG