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

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

// 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)
    {}

}

Класс шаблона будет создан с аргументами шаблона из перечисленных выше типов enum и array:

Например 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 = {{.....}};
0
mts 11 Апр 2019 в 17:24

2 ответа

Лучший ответ

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

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

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

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);
};
1
p-a-o-l-o 11 Апр 2019 в 14:33