如何查找可变参数模板参数中给出的所有类对象

时间:2017-06-01 15:39:26

标签: c++ templates variadic

我想找到给定类型的所有对象并将它们添加到vector中。 现在我有代码:

template<class T>
void fill1(std::vector<Character*> &vec2)
{
    for (int i = 0; i < GameObject::allObjects.size(); i++)
    {
         if (dynamic_cast<T>(GameObject::allObjects[i]))
         {
             vec2.push_back(dynamic_cast<Character*>(GameObject::allObjects[i]));
         }
    }
}

 template<class First, class ...T>
 void fill2(std::vector<Character*> &vec2) 
 {
     fill1<First>(vec2);
     fill2<T...>(vec2);
 }

 template<class ... T>
 std::vector<Character*> SpecialList<T...>::get()
 {
      std::vector<Character*> vec2;
      fill2<T...>(vec2);
      return vec2;
 }

代码根本不编译。 我们得到的错误是:     无法推断出'First'

的模板参数

我知道所有给定的类型都是从类Character继承的,我有一个所有对象的向量(GameObject :: allObjects)。

1 个答案:

答案 0 :(得分:0)

而不是递归使用参数包扩展虚拟数组的列表初始化,例如:

#include <vector>
#include <memory>
#include <tuple>
#include <iostream>
#include <algorithm>

template <class... Ts>
struct tag { };

template <class T>
struct Predicate {
    template <class U>
    bool operator()(std::shared_ptr<U> sp) const {
        return std::dynamic_pointer_cast<T>(sp) != nullptr;
    }
};

template <class... Ts, class T>
std::vector<std::shared_ptr<T>> all(std::vector<std::shared_ptr<T>> &v, tag<Ts...>) {
    std::vector<std::shared_ptr<T>> result;
    int dummy[] {(std::copy_if(v.begin(), v.end(), std::back_inserter(result), Predicate<Ts>{}),0)...};
    static_cast<void>(dummy);
    return result;
}

struct A {
    virtual ~A() = default;
};

struct B: A { };
struct C: A { };

int main() {
    std::vector<std::shared_ptr<A>> v { std::make_shared<A>(), 
                                        std::make_shared<A>(), 
                                        std::make_shared<B>(), 
                                        std::make_shared<B>(), 
                                        std::make_shared<C>(), 
                                        std::make_shared<C>() };

    std::cout << all(v, tag<B, C>{}).size() << std::endl;
}

[live demo]