[英]C++ Template queue with template class
My template queue is below我的模板队列在下面
template <typename T>
class LockingQueue
{
private:
std::queue<T> s_queue;
public:
void push(T const& value)
{}
T pop()
{}
};
And my template class is below我的模板 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>>;
I want to put the template class as the parameter of LockingQueue, eg LockingQueue<CommonMsgConstPtr >
.我想把模板 class 作为 LockingQueue 的参数,例如
LockingQueue<CommonMsgConstPtr >
。 I know it is wrong.我知道这是错误的。 what should I do?
我应该怎么办?
As far as I am aware, you can do this in two ways.据我所知,您可以通过两种方式做到这一点。 In both ways you need to specialize your original class template so that it gets instantiated when you pass a smart pointer.
在这两种方式中,您都需要专门化您的原始 class 模板,以便在您传递智能指针时将其实例化。 The simplest way is option 1 (see code below), but you must specify the type in the main function.
最简单的方法是选项 1(见下面的代码),但必须在主 function 中指定类型。 A bit dirtier approach is option 2 (see code below), but the call in the main function is cleaner and closer to your original post.
选项 2 有点脏(见下面的代码),但主 function 中的调用更干净,更接近您的原始帖子。
Btw, why boost::shared_ptr
and not std::shared_ptr
?顺便说一句,为什么
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;
}
Online example: https://ideone.com/h6o02M在线示例: https://ideone.com/h6o02M
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.