我知道我把标题弄得越模糊越好,但这个示例希望能设定目标。
我有一个Base
班和Derived
班的家庭(classyood,仅此而已)。
此外,我有一个函数,它接受可变模板,我想根据这些模板做出决定。
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
}
}
}