簡體   English   中英

C++ 帶有模板 class 的模板隊列

[英]C++ Template queue with template class

我的模板隊列在下面

template <typename T>
class LockingQueue
{
private:
    std::queue<T> s_queue; 
public:
    void push(T const& value)
    {}

    T pop()
    {}
};

我的模板 class 如下

template <typename TaskData, typename TaskName>
class CommonMsg
{
public:
    TaskData dataType;
    TaskName taskName;
};
template <typename TaskData, typename TaskName>
using CommonMsgPtr = boost::shared_ptr<CommonMsg<TaskData, TaskName>>;
template <typename TaskData, typename TaskName>
using CommonMsgConstPtr = boost::shared_ptr<const CommonMsg<TaskData, TaskName>>;

我想把模板 class 作為 LockingQueue 的參數,例如LockingQueue<CommonMsgConstPtr > 我知道這是錯誤的。 我應該怎么辦?

據我所知,您可以通過兩種方式做到這一點。 在這兩種方式中,您都需要專門化您的原始 class 模板,以便在您傳遞智能指針時將其實例化。 最簡單的方法是選項 1(見下面的代碼),但必須在主 function 中指定類型。 選項 2 有點臟(見下面的代碼),但主 function 中的調用更干凈,更接近您的原始帖子。

順便說一句,為什么boost::shared_ptr而不是std::shared_ptr

#include <iostream>
#include <queue>
#include <memory>

template <typename T>
struct LockingQueue
{
    std::queue<T> s_queue;
    ...
};

// Option 1
template < typename CM, template<typename> class SP>
struct LockingQueue<SP<CM>>
{
    std::queue< SP<CM> > s_queue;
    ...
};

// Option 2
template < typename T, typename R, template<typename,typename> class CM, template<typename> class SP>
struct LockingQueue<SP<CM<T,R>>>
{
    std::queue< SP<CM<T,R>> > s_queue;
    ...
};

template <typename TaskData, typename TaskName>
struct CommonMsg
{
    TaskData dataType;
    TaskName taskName;
};

template <typename TaskData, typename TaskName>
using CommonMsgPtr = std::shared_ptr<CommonMsg<TaskData, TaskName>>;

template <typename TaskData, typename TaskName>
using CommonMsgConstPtr = std::shared_ptr<const CommonMsg<TaskData, TaskName>>;

// Option 1 alias
template < typename CM, template<typename> class SP = std::shared_ptr>
using CommonMsgConstSPtr1 = SP< const CM >;

// Option 2 alias
template < typename TaskData = int, typename TaskName = char, template<typename,typename> class CM = CommonMsg, template<typename> class SP = std::shared_ptr>
using CommonMsgConstSPtr2 = SP< const CM<TaskData, TaskName> >;

int main()
{
    LockingQueue< CommonMsgConstSPtr1< CommonMsg<int,char> > > option1;
    LockingQueue< CommonMsgConstSPtr2<> > option2;
}

在線示例: https://ideone.com/h6o02M

暫無
暫無

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

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