Я использую шаблоны во встроенной среде, где мне нужно статически объявить все. Я хотел бы знать, есть ли способ объявить необязательное поле в классе с помощью шаблонов или аналогичной техники.
Теперь в одном из классов я пытаюсь сделать что-то вроде этого ...
template<typename Filter, typename Compensation.....>
class MeasurementChannel {
private:
if constexpr( !std::is_same<Compensation, void>){
Compensation _comp; // this is an optional field
}
....
....
};
Теперь это не работает, и в реальном примере у меня может быть 4+ различных подключаемых компонента, таких как Компенсация, что делает частичную специализацию проблемой, потому что мне понадобится 16 специализаций, чтобы иметь дело с различными комбинациями пустоты в каждая из дополнительных позиций.
Лучший способ, который я придумал до сих пор, - это создать нулевой класс (в данном случае NullComp), который реализует интерфейс basi c, но ничего не делает и заменяется пользователем, когда он не хочет функциональность этого компонента как часть шаблонного класса. В зависимости от уровня оптимизации компилятора большая часть генерируемого кода оптимизируется, но я хотел бы иметь возможность гарантировать, что вообще ничего не будет создано. .
Итак, мой вопрос в основном сводится к тому, есть ли в шаблонах какой-либо способ необязательного объявления поля как части класса. Т.е. есть какая-то техника, которая дает эквивалент использования std :: enable_if с методами.
В качестве альтернативы я просто пытаюсь сделать это неправильно, и есть простой элегантный способ создания шаблонов, который достигает той же конечной цели, используя какая-то совершенно другая техника.