我的模板佇列在下面
template <typename T>
class LockingQueue
{
private:
std::queue<T> s_queue;
public:
void push(T const& value)
{}
T pop()
{}
};
我的模板類在下面
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>>;
我想把模板類作為LockingQueue的引數,例如
LockingQueue<CommonMsgConstPtr >. 我知道這是錯誤的。我應該怎么辦?
uj5u.com熱心網友回復:
據我所知,您可以通過兩種方式做到這一點。在這兩種方式中,您都需要專門化您的原始類模板,以便在您傳遞智能指標時將其實體化。最簡單的方法是選項 1(參見下面的代碼),但您必須在 main 函式中指定型別。選項 2 有點臟(見下面的代碼),但 main 函式中的呼叫更干凈,更接近您的原始帖子。
順便說一句,為什么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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515161.html
標籤:C 模板容器模板模板
下一篇:當兩種型別都是8位元組長時,`std::is_same_v<size_t,uint64_t>`評估為`false`
