问题描述
我知道我把标题弄得尽可能模糊,但样本有望设定目标。
我有一个 Base
类和 Derived
个类的族(经典的 OOD,仅此而已)。
此外,我有一个采用可变参数模板的函数,我想根据这些模板做出决定。
template<typename... Ts>
void do_smth(std::vector<std::shared_ptr<Base>>& vec) {
for (auto&& ptr: vec) {
if the dynamic type of ptr is one of Ts.. then do smth.
}
}
do_smth<Derived1,Derived2>(vec);
我知道我可以使用 Ts...
或类似这样的方式将 std::variant
转发到 hold_alternative
检查,但我只有类型而不是值。更复杂的是,我的编译器受 C++14 支持的限制。
有人可以为此提出一些小巧/优雅的解决方案吗?
解决方法
更复杂的是,我的编译器仅限于 C++14 支持。
C++14 ... 所以你必须模拟模板折叠...
以下内容呢?
template<typename... Ts>
void do_smth (std::vector<std::shared_ptr<Base>>& vec) {
using unused = bool[];
for ( auto&& ptr: vec)
{
bool b { false };
(void)unused { b,(b = b || (dynamic_cast<Ts*>(ptr) != nullptr))... };
if ( b )
{
// ptr is in Ts... list
}
else
{
// ptr isn't in Ts... list
}
}
}