具有C ++约束的模板的专业化

时间:2016-09-05 08:35:25

标签: c++ templates c++-cli template-specialization type-constraints

我正在尝试在c ++ / cli中实现managed-> native转换器。有大约20种类型转换所以我正在尝试使用模板。 问题是我应该以不同的方式处理值类型和引用类型。

这是我正在尝试实现的(此代码没问题。至少它编译):

#define val_t_constraint(T) std::enable_if_t<std::is_integral<T>::value || std::is_floating_point<T>::value, T>
#define ref_t_constraint(T) std::enable_if_t<!std::is_integral<T>::value && !std::is_floating_point<T>::value, T>

template<class TElementIn, class TElementOut = TElementIn>
static val_t_constraint(TElementOut) convert(const TElementIn& native)
{
    return (TElementOut)native;
}

template<class TElementIn, class TElementOut = TElementIn>
static ref_t_constraint(TElementOut)^ convert(const TElementIn& native)
{
    return gcnew TElementOut();
}

template<class TElementIn, class TElementOut = TElementIn>
static array<val_t_constraint(TElementOut)>^ convert(const std::vector<TElementIn>& native)
{
    auto arr = gcnew array<TElementOut>(1);
    arr[0] = convert<TElementIn, TElementOut>(native[0]);
    return arr;
}

template<class TElementIn, class TElementOut = TElementIn>
static array<ref_t_constraint(TElementOut)^>^ convert(const std::vector<TElementIn>& native)
{
    auto arr = gcnew array<TElementOut^>(1);
    arr[0] = convert<TElementIn, TElementOut>(native[0]);
    return arr;
}

但是当我试图专门化一些模板时,例如:

template<>
static array<ref_t_constraint(Guid)^>^ convert(const std::vector<char>& native)
{
    return gcnew array<Guid^>(1);
}

我收到了一个错误 “错误C2912:显式特化'cli :: array ^ Baz :: convert(const std :: vector&gt;&amp;)'不是函数模板的特化”。

通过未使用的函数参数的约束给我另一个错误 - 模板函数特化不能有默认参数。 通过其他模板参数的约束不起作用。我想因为VC ++ 120中的SFINAE实现。

是否可以实施此类解决方案?也许我做错了什么? 我正在使用VC ++ 120。

1 个答案:

答案 0 :(得分:0)

我错误地将模板专门化了。 正确的版本:

template<>
static array<Guid> convert<char, Guid>(const std::vector<char>& native)
{
    auto arr = gcnew array<Guid>(1);
    arr[0] = convert<char, Guid>(native[0]);
    return arr;
}