簡體   English   中英

使用可變參數模板的成員的類

[英]Class with member that uses variadic template

我試圖了解模板的工作方式,並且提出了這個問題。 現在,我完全意識到可以使用多態來解決它,但是我很好奇是否可以僅使用模板來解決它。 情況如下:

假設我有兩種隊列,它們的定義如下:

#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;

關於如何解決這個問題有什么建議嗎?

不要那樣做。

相反,讓您的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;

您的任一種方式都可以。 泛型是好的。

已經有一個可接受的答案,但是我想顯示所需的語法。

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

現在,該行也可以編譯:

User<int, FIFO> u1;

由於模板User僅接受兩個參數,因此無法編譯最后兩行。 只需添加第三個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM