Оптимизация шаблона для базового типа enum - PullRequest
0 голосов
/ 04 июня 2019

У меня есть два примера кода ниже.Оба они интерпретируют перечислимый или перечислимый класс как их основной тип.Какой из них будет меньше после компиляции при использовании нескольких различных перечислений?

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

В первом случае перечисление передается как параметр шаблона:

template<class ENUM>
class my_enum
{
  private:
    // Check if the given template parameter is indeed an enum or enum class.
    static_assert(std::is_enum<ENUM>::value, "This class only supports enum and enum classes as template parameter.");

    // Get the underlying type of the enum.
    typedef INT_TYPE = std::underlying_type<ENUM>::type;

  public:
    // Useful code

  private:
    // The actual data
    INT_TYPE data; 
};

Использование этого будет выглядеть следующим образом:

enum enumA {
 x = 0,
 y,
 z
}

enum enumB {
 a = -10,
 b = -30,
 c =  100
}

my_enum<enumA> A;
my_enum<enumB> B;

Вторая возможность, которую я вижу, это передача базового типа непосредственно в качестве параметра шаблона:

template<class INT_TYPE>
class my_enum2
{
  public:
    // Useful code

  private:
    // The actual data
    INT_TYPE data; 
};

Это будет использоваться как:

my_enum2<std::underlying_type<enumA>::type> A;
my_enum2<std::underlying_type<enumB>::type> B;

Я вижу, что последний вариант генерирует только 4-6реализации для целых чисел без знака и без знака различных размеров.Выписать определение, однако, не так аккуратно.

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

1 Ответ

1 голос
/ 04 июня 2019

Поскольку my_enum<enumA> и my_enum<enumB> являются различными типами, они получают отдельные экземпляры, даже если сгенерированный код идентичен.

Ваша вторая версия, в которой вы передаете базовый тип перечисления в качестве параметра шаблона, приведет к меньшему количеству кода, так как enumA и enumB будут использовать один и тот же тип в качестве параметра шаблона, генерируя один и тот же шаблонный тип .

...