引用嵌套模板参数
Referencing to the nested template parameter
我需要一个模板的模板class,但问题是,我无法访问嵌套模板的类型:
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 被使用了两次。
不,你不能。但是你应该通过
ParameterBasedFilter<SomePayload, SomeMessage> filter;
SomePayload
不会重复使用。
此外,访问 otherType
时应使用 typename
typedef typename TParamPayload::otherType SomeOtherType;
也许您正在寻找部分专业化?这将允许您的问题中提到的原始语法:
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;
我需要一个模板的模板class,但问题是,我无法访问嵌套模板的类型:
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 被使用了两次。
不,你不能。但是你应该通过
ParameterBasedFilter<SomePayload, SomeMessage> filter;
SomePayload
不会重复使用。
此外,访问 otherType
typename
typedef typename TParamPayload::otherType SomeOtherType;
也许您正在寻找部分专业化?这将允许您的问题中提到的原始语法:
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;