引用嵌套模板参数

时间:2015-01-15 10:50:13

标签: c++ templates

我需要一个模板模板类,但问题是,我无法访问嵌套模板的类型:

template<template<class TParamPayload> class TMsg>
class ParameterBasedFilter : public IMsgFilter
{
public:
    typedef TMsg<TParamPayload> ExpectedMessage;
    typedef TParamPayload::otherType SomeOtherType;
};

这是一个用法(我想只传递一个模板参数,不带逗号)

ParameterBasedFilter<SomeMessage<SomePayload>> filter;

ParameterBasedFilter中有一个错误:

error: 'TParamPayload' was not declared in this scope
typedef TMsg<TParamPayload> ExpectedMessage;
             ^

是否可以获得嵌套模板类型?我知道,下面的代码可以使用

template<class TParamPayload, template<class> class TMsg>
class ParameterBasedFilter : public IMsgFilter
{
public:
    typedef TMsg<TParamPayload> ExpectedMessage;
    typedef TParamPayload::otherType SomeOtherType;
};

但是我必须将2种类型传递给模板参数:

ParameterBasedFilter<SomePayload, SomeMessage<SomePayload>> filter;

它看起来很奇怪,因为SomePayload被使用了两次。

2 个答案:

答案 0 :(得分:3)

也许您正在寻找部分专业化?这将允许您的问题中提到的原始语法:

template <typename> class ParameterBasedFilter;

template <template<class> class TMsg, typename TParamPayload>
class ParameterBasedFilter<TMsg<TParamPayload>> : public IMsgFilter
{
public:
    typedef TMsg<TParamPayload> ExpectedMessage;
    typedef TParamPayload::otherType SomeOtherType;
};

用法很简单:

ParameterBasedFilter<SomeMessage<SomePayload>> filter;

答案 1 :(得分:2)

不,你不能。但是你应该通过

ParameterBasedFilter<SomePayload, SomeMessage> filter;

SomePayload不会被使用两次。 此外,您应该在访问typename

时使用otherType
typedef typename TParamPayload::otherType SomeOtherType;