gpt4 book ai didi

c++ - 安全 bool 多重转换歧义

转载 作者:行者123 更新时间:2023-11-28 05:55:06 24 4
gpt4 key购买 nike

为了支持没有 explicit 关键字的编译器(例如 MSVC 2012),我必须实现安全的 bool 习惯用法。应该为 bool 检查的类正在为指向许多类的指针建模,因此它应该可以转换为这些指针。下面的代码说明了这个想法:

// Uncomment this line to change implementation to 'safe bool'
// #define _COMPILER_NO_EXPLICIT

#if !defined(_COMPILER_NO_EXPLICIT)
#define OPERATOR_BOOL_MYTYPE(...)
#define OPERATOR_BOOL_IMPLEMENTATION(...) \
public: \
explicit operator bool() const noexcept \
{ \
return __VA_ARGS__; \
}
#else
#define OPERATOR_BOOL_MYTYPE(...) \
private: \
void safe_bool() {}; \
typedef __VA_ARGS__ safe_bool_my_type_t; \
typedef void (safe_bool_my_type_t::*safe_bool_t)()

#define OPERATOR_BOOL_IMPLEMENTATION(...) \
public: \
operator safe_bool_t() const noexcept \
{ \
return __VA_ARGS__ ? \
&safe_bool_my_type_t::safe_bool : \
nullptr; \
}
#endif


class Convertible
{
public:
operator int*() const
{ return nullptr; }

operator double*() const
{ return nullptr; }

OPERATOR_BOOL_MYTYPE(Convertible);
OPERATOR_BOOL_IMPLEMENTATION(false);
};


int main(void)
{
Convertible a;
if (a)
{
// this 'if' statement introduces compilation error
// in 'safe bool' implementation
}
return 0;
}

如果我们使用基于 explicit operator bool() 的实现,一切正常。问题实际上在于基于“安全 bool ”的实现中的模棱两可的可转换性。应该怎么解决?

注意:考虑将 bool 转换实现独立于其他到指针的转换实现。如果不可能给我一个线索如何在依赖案例中实现它,例如如果 Convertible 计算结果为 true 当且仅当其他转换运算符之一返回非空值。

UPD:我相信有一种方法可以使一个隐式转换比其他所有转换更可取。

最佳答案

确定需要隐式转换为其他指针类型吗?如果您不需要它,问题就会消失。

如果你确实需要隐式转换为指针类型,问题似乎没有实际意义:你不需要转换为 bool,因为转换为指针也会产生一个可以进行真值测试的值(就像常规原始指针)。

但由于您同时拥有 int*double* 的运算符,因此您仍然存在不明确的转换。这部分可能需要重新设计,因为您不清楚如何期望单个值可以隐式转换为多个不相关的指针类型。

关于c++ - 安全 bool 多重转换歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34334626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com