Поиск типа (возможно, базового) из структурного типа для использования в шаблонах - PullRequest
0 голосов
/ 11 апреля 2019

Возможно, это уже ответили или это обычное дело, но мне не хватает подходящего термина для поиска по этому поводу.

Для приведенного ниже примера кода:

// In a separate file
enum class SignsEnum : uint32_t
{
    S1 = 0,
    S2,
    S3
};

std::array<SignsEnum, 10> arrayMyEnum1 = {{.....}};


// other template class file
template<typename ENUM_T, typename ARRAY_T>
class SignsProc
{

    int32_t SignConvrsn(ENUM_T InSign)
    {
    }

    int32_t ProcData(ARRAY_T& InData)
    {}

}

Будет создан экземпляр класса шаблона с аргументами шаблона из перечисленного выше примера перечисления и типов массива:

например SignsProc<SignsEnum , std::array<SignsEnum, 10>> objSignsProc;

На самом деле, мне может потребоваться передать еще 4-5 типов в аргументы шаблона класса.Принимая во внимание, например, что в приведенном выше примере массив содержит объект типа "SignsEnum" в качестве элементов массива.Теперь этот тип снова передается как 1-й аргумент шаблона, так что функция (SignConvrsn) может быть определена, как в примере выше.Итак, можно ли как-то найти и использовать тип "SignsEnum" из типа массива вместо того, чтобы передавать его отдельно?

Проблема в том, что: Слишком много аргументов шаблона (и кажется избыточным)

Цель: , чтобы уменьшить количество аргументов шаблона

Спасибо

Редактировать (дополнительный сценарий):

, если для случая элемент массива является структурой, а элемент структуры не имеет типа SignsEnum,тогда возможно ли извлечь из него тип "SignsEnum"?

// In a separate file
enum class SignsEnum : uint32_t
{
    S1 = 0,
    S2,
    S3
};

struct SignsConfig
{
    SignsEnum sign;
    int32_t config1;
    int32_t config2;
}

std::array<SignsConfig, 10> arrayMyEnum1 = {{.....}};

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы можете изменить свою машину, чтобы использовать специализацию:

template <typename ARRAY_T> class SignsProc;

template <std::size_t N, typename T>
class SignsProc<std::array<T, N>>
{
public:
    int32_t SignConvrsn(T InSign);
    int32_t ProcData(std::array<T, N>& InData);
};

или используйте псевдоним типа:

template <typename ARRAY_T>
class SignsProc
{
    using E = typename ARRAY_T::value_type;
public:
    int32_t SignConvrsn(E InSign);
    int32_t ProcData(ARRAY_T& InData);
};
0 голосов
/ 11 апреля 2019

У вас есть два варианта уменьшения количества аргументов:

  1. Вариант 1. Передайте аргумент шаблона массива и извлеките тип элемента с помощью ARRAY :: value_type
  2. Вариант 2. Если контейнер всегда будет массивом определенного размера, передайте из него тип элемента и создайте тип массива.
...