Специализация шаблонов с ограничениями в переполнении стека

Я пытаюсь реализовать управляемый-> нативный конвертер в c ++ / 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.

Возможно ли реализовать такое решение? Может я что то не так делаю?
Я использую VC ++ 120.

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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]