Я пытаюсь реализовать управляемый-> собственный преобразователь в С++/cli. Есть около 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> &)' не является специализацией шаблона функции".
Ограничения через неиспользуемый параметр функции дают мне еще одну ошибку - специализации функций шаблона не могут иметь параметры по умолчанию. Ограничения через дополнительные аргументы шаблона не работают. Я думаю, из-за реализации SFINAE в VC++120.
Возможно ли реализовать такое решение? Может я что-то не так делаю? Я использую VС++120.
is_integral
иis_floating_point
)? - person Walter   schedule 05.09.2016