具有编译时间常数的模板专业化

丹尼尔·希尔加斯(Daniel Hilgarth)

我正在尝试为具有编译时间常数的模板类建立专门化的版本。

模板类如下所示:

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':部分专业化中不允许使用默认模板参数

有什么办法解决吗?

阿恩·默兹(Arne Mertz)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章