Параметр выравнивания спецификатора класса C через шаблон

#c #alignas

#c #выравнивание

Вопрос:

Можно ли использовать параметры шаблона C для управления спецификаторами в самом классе, чтобы минимизировать некоторое дублирование кода?

Например: у меня есть класс, который я хотел бы использовать как в параллельном контексте (и контейнере) со alignas спецификатором, так и в однопоточном контексте без alignas спецификатора. Размер класса невелик (20B) — меньше строки кэша. Мне действительно нужно копировать между двумя классами. Прямо сейчас я продублировал код для двух определений двух классов, которые в основном совпадают, кроме указанного спецификатора. Могут ли шаблоны или иным образом разрешать одно определение, одно с alignas и одно без?

Комментарии:

1. Почему требуется параллельный контекст alignas ?

2. Будете ли вы использовать класс со alignas спецификатором и без него в одном проекте?

3. Вы говорите, что вам нужно иметь возможность копировать между двумя версиями класса. Но имейте в виду, что шаблоны не являются наследованием. Таким образом, они рассматриваются как совершенно другой класс после фактического запуска компиляции.

4. @Eugene для предотвращения совместного использования ложных данных в ситуации производитель-потребитель

5. @NathanOliver да

Ответ №1:

Вы можете сделать это следующим образом:

 template <size_t alignment = 0>
class alignas(alignment) C {
    // ...
};
 

Теперь C<> для его определения будет использоваться выравнивание по умолчанию (поскольку alignas(0) игнорируется), в то время как вы могли бы использовать, например C<16> , для принудительного выравнивания 16.