我正在尝试在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。
答案 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;
}