#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;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxxdWV1ZT4KICAgICNpbmNsdWRlIDxtZW1vcnk+CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgc3RydWN0IExvY2tpbmdRdWV1ZQogICAgewogICAgICAgIHN0ZDo6cXVldWU8VD4gc19xdWV1ZTsKICAgIH07CgogICAgLy8gT3B0aW9uIDEKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ00sIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBTUD4KICAgIHN0cnVjdCBMb2NraW5nUXVldWU8U1A8Q00+PgogICAgewogICAgICAgIHN0ZDo6cXVldWU8IFNQPENNPiA+IHNfcXVldWU7CiAgICB9OwoKICAgIC8vIE9wdGlvbiAyCiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIsIHRlbXBsYXRlPHR5cGVuYW1lLHR5cGVuYW1lPiBjbGFzcyBDTSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIFNQPgogICAgc3RydWN0IExvY2tpbmdRdWV1ZTxTUDxDTTxULFI+Pj4KICAgIHsKICAgICAgICBzdGQ6OnF1ZXVlPCBTUDxDTTxULFI+PiA+IHNfcXVldWU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFza0RhdGEsIHR5cGVuYW1lIFRhc2tOYW1lPgogICAgc3RydWN0IENvbW1vbk1zZwogICAgewogICAgICAgIFRhc2tEYXRhIGRhdGFUeXBlOwogICAgICAgIFRhc2tOYW1lIHRhc2tOYW1lOwogICAgfTsKICAgIAogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhc2tEYXRhLCB0eXBlbmFtZSBUYXNrTmFtZT4KICAgIHVzaW5nIENvbW1vbk1zZ1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxDb21tb25Nc2c8VGFza0RhdGEsIFRhc2tOYW1lPj47CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUYXNrRGF0YSwgdHlwZW5hbWUgVGFza05hbWU+CiAgICB1c2luZyBDb21tb25Nc2dDb25zdFB0ciA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDb21tb25Nc2c8VGFza0RhdGEsIFRhc2tOYW1lPj47CiAgICAKICAgIC8vIE9wdGlvbiAxIGFsaWFzCiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENNLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgU1AgPSBzdGQ6OnNoYXJlZF9wdHI+CiAgICB1c2luZyBDb21tb25Nc2dDb25zdFNQdHIxID0gU1A8IGNvbnN0IENNID47CgogICAgLy8gT3B0aW9uIDIgYWxpYXMKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVGFza0RhdGEgPSBpbnQsIHR5cGVuYW1lIFRhc2tOYW1lID0gY2hhciwgdGVtcGxhdGU8dHlwZW5hbWUsdHlwZW5hbWU+IGNsYXNzIENNID0gQ29tbW9uTXNnLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgU1AgPSBzdGQ6OnNoYXJlZF9wdHI+CiAgICB1c2luZyBDb21tb25Nc2dDb25zdFNQdHIyID0gU1A8IGNvbnN0IENNPFRhc2tEYXRhLCBUYXNrTmFtZT4gPjsKICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgCUxvY2tpbmdRdWV1ZTwgQ29tbW9uTXNnQ29uc3RTUHRyMTwgQ29tbW9uTXNnPGludCxjaGFyPiA+ID4gb3B0aW9uMTsKICAgIAlMb2NraW5nUXVldWU8IENvbW1vbk1zZ0NvbnN0U1B0cjI8PiA+IG9wdGlvbjI7CiAgICB9