Templates 可变模板-在相同类型的对象元组中查找最小值

Templates 可变模板-在相同类型的对象元组中查找最小值,templates,c++11,variadic,Templates,C++11,Variadic,我试图通过破解代码破解代码采访页面来解决以下练习。81: 动物收容所只收容猫狗,严格按照规定的标准运作 先进先出的原则。人们必须收养年龄最大的一个 根据所有动物到达庇护所的时间,或者他们可以 选择他们喜欢狗还是猫,并将收到 这种最古老的动物。他们无法选择哪种特定的动物 他们会喜欢的。创建数据结构以维护此系统 并实现诸如enqueue、dequeueAny、dequeueDog和 您可以使用内置的LinkedList数据结构 只有两只动物很容易,我设法实现了一个班级庇护所,它有两个单独的队列,一个

我试图通过破解代码破解代码采访页面来解决以下练习。81:

动物收容所只收容猫狗,严格按照规定的标准运作 先进先出的原则。人们必须收养年龄最大的一个 根据所有动物到达庇护所的时间,或者他们可以 选择他们喜欢狗还是猫,并将收到 这种最古老的动物。他们无法选择哪种特定的动物 他们会喜欢的。创建数据结构以维护此系统 并实现诸如enqueue、dequeueAny、dequeueDog和 您可以使用内置的LinkedList数据结构

只有两只动物很容易,我设法实现了一个班级庇护所,它有两个单独的队列,一个供猫和狗排队,并存储动物排队的时间。然而,我想知道如何将其推广到一些通用的动物,而不需要实际更改班级庇护所的界面。我认为可变模板可能会有所帮助,但我无法理解如何编写代码/语法来为不同类型的动物声明不同的队列

首先,这可能吗?有人有主意吗

多亏了这些建议,我想我取得了一些进展:

template <typename A>
struct Animal {
    string hello(void) {return A::hello(); }
    string name;
};


class GenericAnimal {
    public: 
        virtual string hello(void) {return "????";}
};

class Dog : public GenericAnimal {

    public:
        virtual string hello (void) {return "waf waf";}
};
class Cat : public GenericAnimal {
    public:
        virtual string hello (void) {return "miao miao";}
};


template <typename ...A>
class Shelter {
    public:
        Shelter():time(0){}
        template <typename T>
        void getQueueFor( queue< tuple<int, Animal<T>> > &q ){
            q= get< queue< tuple<int, Animal<T>> > > (shelterQueues);
        }

        template <typename T>
        void addAnimals(Animal<T> &a) {
            tuple<int, Animal<T>> aa  (time++, a);
            (get< queue< tuple<int, Animal<T>> > > (shelterQueues)).push(aa);
        } 

        GenericAnimal& getOldestAnimal (void) {
            size_t size= std::tuple_size<decltype(shelterQueues)>::value;
            for(size_t i=0; i < size; i++) {
                get<0>(shelterQueues);
                cout << i << ",";
            } 
            cout << endl;

        }

    private:
        int time;
        tuple< queue< tuple <int, Animal<A>> >... > shelterQueues;
};
我现在能给猫和狗喂食了。 现在,我试图实现dequeAny,它应该返回系统中最古老的动物,但我被卡住了。基本上,问题是我必须迭代队列的元组,看看哪个头的时间最短。环顾四周,我发现了如何迭代元组。问题是,即使我设法识别它,让我们称之为K,那么我需要执行getmyQueue,这不应该起作用,因为K在编译时是未知的。我错了吗? 如果可能的话,你知道怎么做吗

谢谢使用std::tuple。如注释中所述,元组适合您的用例。元组的一个有用之处在于,它允许您按类型查询元素,只要它所模板化的类型是唯一的。下面是一个例子:

template <typename ... Animals>
class AnimalQueue
{
public:
template <typename T>
queue<T> GetQueueFor(){return get<queue<T>>(mQueues);}

tuple<queue<Animals>...> mQueues;
};

用户请求避难所,在班级避难所中,您可以存储一个元组。另一种方法是使用单个队列。非常感谢。这是我想使用的东西之一,我被卡住了,因为在我看到的所有关于tuple的示例中,似乎您需要知道每个类型声明的位置,所以当我执行addAnimalcat时,我如何获得正确的队列?我看到元组被访问的方式是使用get。还有别的办法吗?我遗漏了什么吗?@Kude tuple::get的重载也采用了该类型。看看4-6。因此,假设该类名为cat,使用上面的代码片段,您可以执行GetQueueFor以从元组中获取队列元素。酷!非常感谢,我会试一试的!但是,按类型获取元组元素是C++14中的一项新功能,因此您的编译器可能还不支持它。