2016-09-24 24 views
1

我想了解模板是如何工作的,而且我已经想出了这个问题。现在,我完全意识到它可以使用多态性来解决,但我很好奇,看看它是否可以通过使用模板来解决。情况如下:使用可变模板的成员的类

假设我有两种类型的队列,其被定义如下:

#include <queue> 
template <typename GenType, typename Comparator> 
class Priority 
{ 
public: 
    Priority() 
    { } 
    ~Priority() 
    { } 
    void insert(GenType const& t) 
    { mQueue.push(t); } 
private: 
    std::priority_queue<GenType, std::vector<GenType>, Comparator> mQueue; 
}; 

template<typename GenType> 
class FIFO 
{ 
public: 
    FIFO() 
    { } 
    ~FIFO() 
    { } 
    void insert(GenType const& t) 
    { mList.push_front(t); } 
private: 
    std::deque<GenType> mList; 
}; 

而现在,我有一个类,可以使用QueueFIFO(或任何其它类型队列中的)所示:

// I'm not sure that this is how it should be declared... 
template <typename GenType, 
    template<typename, typename...> class List> 
class User 
{ 
public: 
    User() 
    { } 
    ~User() 
    { } 
    void add(GenType const& t) 
    { mList.insert(t); } 
private: 
    // This line gives an error. 
    List mList; 
}; 

因为它的立场,标线给出了一个错误,这我理解,因为我还没有实际传递任何模板参数List。问题是我不知道如何解决这个错误。

给予一定的情况下,使用情况下这是能够有User类采取任何类型的队列,并可以像这样使用:

User<int, FIFO> u1; 
// Not sure if it is this way: 
User<int, Priority, std::less<int>> u2; 
// Or this way: 
User<int, Priority, std::less> u2; 

如何解决这个任何建议问题?

+0

@ Rakete1111为什么是的,是的。我现在就解决它。 – Mauricio

回答

1

不要这样做。

相反,让您的User类模板采取它会使用容器的全型,而让容器指出是哪一种类型的值:

template <typename Container> 
class User 
{ 
public: 
    using value_type = typename Container::value_type; // you'll have to add this 
                 // typedef to your containers 

    User() = default; 
    ~User() = default; 

    void add(value_type const& t) 
    { 
     mList.insert(t); 
    } 

private: 
    Container mList; 
}; 

这样一来,我作为你的班级模板的用户可以提供正确的事情。如果我想用你的优先级队列,我可以在比较空,我希望直接:

User<Priority<int, std::less<>>> u; 

还是不行:

User<FIFO<int>> u2; 

或者,也许我写我自己的容器,它甚至不是一个班模板:

User<SpecialContainer> u3; 

你的作品无论如何。泛型很好。

+0

谢谢!我一直试图弄清楚这一点,而我从来没有想过这么简单。 – Mauricio

1

已经有一个可接受的答案,但我想展示所需的语法。

private: 
    // This line doesn't give an error. 
    List<GenType> mList; 
}; 

现在这行编译过:

User<int, FIFO> u1; 

最后两行不能编译,因为模板User只接受两个参数。只需添加第三个参数。