gpt4 book ai didi

c++ - 具有编译时间常数的模板特化

转载 作者:行者123 更新时间:2023-11-30 01:17:02 25 4
gpt4 key购买 nike

我正在尝试为具有编译时间常量的模板类构建特化。

模板类如下所示:

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' : default template arguments not allowed on a partial specialization

有什么解决办法吗?

最佳答案

您首先将默认参数定义为 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>());
};

关于c++ - 具有编译时间常数的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25362727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com