根据可变参数类型做出决定

问题描述

我知道我把标题弄得尽可能模糊,但样本有望设定目标。

我有一个 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
        }
    }
}