c++ - 对参数包进行 dynamic_cast
问题描述
考虑这样的代码:
struct A
{
A() = default;
virtual ~A() = default;
};
struct B : public A
{
B() = default;
virtual ~B() = default;
};
struct C : public A
{
C() = default;
virtual ~C() = default;
};
struct D : public A
{
D() = default;
virtual ~D() = default;
};
struct E : public A
{
E() = default;
virtual ~E() = default;
};
template <typename CLASS1, typename CLASS2>
bool AreObjectsEqual(std::vector<A*>& vec)
{
return std::all_of(vec.begin(), vec.end(),
[](const auto v) { return (dynamic_cast<CLASS1*>(v) != nullptr || dynamic_cast<CLASS2*>(v) != nullptr); });
}
int main()
{
std::vector<A*> vec = { new D{}, new C{} };
std::cout << AreObjectsEqual<D, C>(vec) << std::endl;
std::vector<A*> vec1 = { new D{}, new C{}, new E{} };
std::cout << AreObjectsEqual<E, C>(vec) << std::endl;
return 0;
}
上面的代码检查指针向量是否包含可以转换为某些类的对象。但我真正想做的是检查更多的两个模板。就像是:
template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
return std::all_of(vec.begin(), vec.end(),
[](const auto v)
{
bool false = true;
for(auto CLASS : CLASSES)
retValue ||= (dynamic_cast<CLASS*>(v) != nullptr);
return retValue;
});
}
std::cout << AreObjectsEqual<B, C, D, E>(vec) << std::endl;
有可能实现吗?每个带有参数包的代码示例也有一个带有参数包的参数,我不需要那个。我只需要知道如何迭代模板...类
解决方案
在 C++17 及更高版本中,您可以使用折叠表达式。
template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
return std::all_of(vec.begin(), vec.end(),
[](const auto v)
{
return (... || (dynamic_cast<CLASSES*>(v) != nullptr));
});
}
在 C++11 和 14 中,有一个有点混淆的习语。
template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
return std::all_of(vec.begin(), vec.end(),
[](const auto v)
{
bool retVal = false;
using expand = int[];
(void)expand{retVal = retVal || (dynamic_cast<CLASSES*>(v) != nullptr)...};
return retVal;
});
}
推荐阅读
- javascript - 在这个练习中我应该使用 JavaScript 中的什么函数?
- clojure - Clojure:您可以将 Concat 与其他非常复杂的函数一起使用吗?
- algorithm - 是否有任何算法能够在考虑多个变量的情况下为图找到树?
- angular - Angular 如何处理多个服务的依赖注入?
- android - 倒数计时器在后台运行,尽管按下了返回
- c# - 从arduino获取串行输出的奇怪行为
- r - knitr::knit 不遍历列表,在第一个块失败
- firebase - Flutter - 在 ListTile 点击时刷新 ListView 中的单个元素
- javascript - 当部分不在视口中时删除菜单类
- module - 如何翻译odoo自定义模块相关字段?(ir.module.module 模型字段:名称、描述、摘要、...)