C ++ создавать псевдонимы для примитивных типов, используя шаблоны? - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь написать некоторые вещи, чтобы обернуть внутренности simd, и я решил, что было бы неплохо сделать что-то вроде

using vec<float, 4> = __m128;

, чтобы я мог использовать шаблоны в некотором коде, который я напишу позже,На самом деле это не относится к вопросу, но __m128 - это тип, представляющий 4 числа с плавающей запятой.Это не работает, и g ++ говорит expected nested-name-specifier before 'vec'.Я знаю, что могу просто написать классы, чтобы обернуть их, или я могу сделать что-то вроде:

template <typename T, int N> struct vec;

template<> struct vec<float, 4>
{
    typedef __m128 type;
};

, и тогда я смогу использовать vec<float,4>::type, но первый способ гораздо удобнее.Я думаю, что это возможно, используя что-то вроде шаблон C ++ typedef , но я не уверен и не знаю синтаксиса.Есть ли способ заставить первое утверждение работать или сделать что-то подобное?

1 Ответ

0 голосов
/ 24 июня 2018

Нет, первый не может работать. Это не имеет смысла, учитывая текущие правила (вы не можете перехватить синтаксис такого шаблона).

Ваше второе решение, однако, идеально! Вам просто нужно сделать небольшую корректировку:

namespace impl {
    template <typename T, int N> struct vec;

    template<> struct vec<float, 4>
    {
        typedef __m128 type;
    };
}

template<typename T, int N>
using vec = typename impl::vec<T, N>::type;

Теперь vec - это фактический шаблон, ссылающийся на type соответствующей структуры.

...