[英]Template specialization with compile time constant
我正在尝试为具有编译时间常数的模板类建立专门化的版本。
模板类如下所示:
template<class TNativeItem, class TComItem = void,
VARTYPE _vartype = _ATL_AutomationType<TComItem>::type>
class InOutComArray
{
private:
CComSafeArray<TComItem, _vartype> _safeArray;
// ...
public:
InOutComArray(
TNativeItem* items, size_t length,
std::function<TComItem(const TNativeItem&)> convertToCom,
std::function<TNativeItem(const TComItem&)> convertFromCom)
: _safeArray(length)
{
// ...
}
// ...
};
用法例如:
InOutComArray<BOOL, VARIANT_BOOL, VT_BOOL>(
items, length, BOOLToVARIANT_BOOL, VARIANT_BOOLToBOOL));
但是,也有一些类型不需要转换,我想为此提供一个简短的版本:
InOutComArray<LONG>(items, length);
我试图这样实现:
template<class TItem, VARTYPE _vartype = _ATL_AutomationType<TItem>::type>
class InOutComArray<TItem, void, _vartype>
: public InOutComArray<TItem, TItem, _vartype>
{
public:
InOutComArray(TItem* items, size_t length)
: InOutComArray<TItem, TItem, _vartype>(
items, length, NoConverter<TItem>, NoConverter<TItem>)
{
}
};
但是,出现以下错误:
'_vartype':部分专门化不允许使用默认模板参数
有什么办法解决吗?
首先,将默认参数定义为void
和_ATL_AutomationType<TComItem>::type
,因此,当给出一个正好为X的参数时,您希望InOutComArray<X>
成为InOutComArray<X, void, _ATL_AutomationType<void>::type>
。
您的部分专业化与此矛盾: InOutComArray<X>
应该是InOutComArray<X, X, _ATL_AutomationType<X>::type>
。
根据您认为第二个参数(即void
或与第一个参数相同)的不同,可以将第二个参数默认设置为第一个参数:
template<class TNativeItem, class TComItem = TNativeItem,
VARTYPE _vartype = _ATL_AutomationType<TComItem>::type>
这样,除了额外的构造函数之外,还涵盖了部分专业化的行为。 这可以通过使用构造函数的默认参数来实现:
template<class TNativeItem, class TComItem = TNativeItem,
VARTYPE _vartype = _ATL_AutomationType<TComItem>::type>
class InOutComArray
{
public:
InOutComArray(
TNativeItem* items, size_t length,
std::function<TComItem(const TNativeItem&)> convertToCom = NoConverter<TNativeItem>(),
std::function<TNativeItem(const TComItem&)> convertFromCom = NoConverter<TNativeItem>());
};
根据标准§14.5.5/ 8类模板的部分专业化[temp.class.spec]:
专业化的模板参数列表不应包含默认模板参数值。
因此,编译器理应抱怨,因为在您的部分专业化工作中,您为VARTYPE _vartype = _ATL_AutomationType<TItem>::type
提供了默认模板参数值。
有什么办法解决吗?
是的,从部分专业化中删除默认模板参数。 不用了
根据主要模板:
template<class TNativeItem, class TComItem = void,
VARTYPE _vartype = _ATL_AutomationType<TComItem>::type>
class InOutComArray
这些类型是等效的:
InOutComArray<LONG>
InOutComArray<LONG, void, _ATL_AutomationType<TComItem>::type>
每当InOutComArray
与实例TComItem = void
,你会得到部分特:
template<class TItem, VARTYPE _vartype>
class InOutComArray<TItem, void, _vartype>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.