使用C++中的模板声明可选的类字段

Declaring an optional class field using templates in C++

本文关键字:字段 声明 C++ 使用      更新时间:2024-05-24

我在嵌入式环境中使用模板,需要静态声明所有内容。我想知道是否有任何方法可以使用模板或类似的技术在类中声明可选字段。

现在,在其中一节课上,我正在尝试做这样的事情。。。

template<typename Filter, typename Compensation.....> 
class MeasurementChannel {
private:
if constexpr( !std::is_same<Compensation, void>){
Compensation _comp; // this is an optional field
}
....
....
};

现在这不起作用,在真实的例子中,我可能有4个以上不同的可插拔组件,比如Compensation,这使得部分专业化成为一个问题,因为我需要16个专业化来处理每个可选职位中不同的空缺组合。

到目前为止,我提出的最好的方法是创建一个null类(在本例中为NullComp(,它实现了基本接口,但什么都不做,当用户不想将组件功能作为模板化类的一部分时,它会被用户替换。根据编译器的优化级别,将生成的大多数代码都被优化掉了,但我希望能够保证一开始不会创建任何代码。

因此,我的问题基本上可以归结为,在模板中是否有任何方法可以选择性地将字段声明为类的一部分。也就是说,有一些技术相当于在方法中使用std::enable_if。

或者,我只是想做错这件事,而有一种简单优雅的方式来编写模板,使用一些完全不同的技术达到相同的最终目标。

这里有一个可能的解决方案,使用条件继承。

template<bool Enable>
struct field_1 {};
template<>
struct field_1<true> { t1 member1; };
template<bool Enable, bool Enable1>
struct field_2 : field_1<Enable1> {};
template<bool Enable1>
struct field_2<true, Enable1> : field_1<Enable1> { t2 member2; };
template<bool Enable2, bool Enable1>
struct main_type : field_2<Enable2, Enable1> {
// body
};

对于太多的字段来说,这会变得很麻烦。也许有一种方法可以让这个变种,我没有想过。

  1. 您可以对其进行部分专门化:
template<class Filter> class MeasurementChannel<Filter, void> {};
  1. 或者,为了不将所有类代码复制到部分专门化,您只能专门化相关部分:
template<class Compensation> class CompHolder {
protected:
Compensation comp; // don't start identifiers with underscores
};
template<> class CompHolder<void> {};
template<class Filter, class Compensation> class MeasurementChannel
: CompHolder<Compensation>
{
};