C# 的 C++ 模拟"is"关键字
c++ analog of c# "is" keyword
我正在将这个c#代码重写为c++:
foreach (var index in indexes)
{
if (index is MaWorker)
{
(index as MaWorker).needCalculate = true;
}
if (index is RocWorker)
{
(index as RocWorker).needCalculate = true;
}
}
什么是最好的c++模拟?我应该使用什么来代替C#is
关键字?
C++11也有foreach和自动类型推理。因此,假设您有一个现代编译器并启用了C++11:
for (auto index : indexes)
{
if (auto w = dynamic_cast<MaWorker*>(index))
{
w->needCalculate = true;
}
if (auto w = dynamic_cast<RocWorker*>(index))
{
w->needCalculate = true;
}
}
请注意,对每个指针使用is
和as
。它们都会检查对象的动态类型,但您只需要检查一次。幸运的是,C++有这种带有声明的条件语法。
最好的c++模拟是使用std::shared_ptr和std::dynamic_pointer_cast。这是因为在c#中,所有对象实际上都是引用计数句柄,而在c++中,它的模拟对象是shared_ptr。
所以:
class Worker {};
class MaWorker : public Worker {};
class RocWorker : public Worker {};
std::vector< std::shared_ptr< Workers > > indexes;
for (const auto& index : indexes) {
if (auto ma = std::dynamic_pointer_cast<MaWorker>(index)) {
ma->needCalculate = true;
}
if (auto roc = std::dynamic_pointer_cast<RocWorker>(index)) {
roc->needCalculate = true;
}
}
然而,这种对类类型的切换打破了OO原则。为什么不将needCalculate成员移到基类中,或者更好地使用一些基类方法来通知对象您正在处理的任何外部事件?也许这超出了转换的范围。
不过要小心。c#对象引用与c++指针不同。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 谷歌模拟和覆盖关键字
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- Is !NaN not a NaN?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- Directx 11 - CompileFromFile() is not compiling
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- Centos7 g++ "to_string is not in a member of std"
- C# 的 C++ 模拟"is"关键字