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

问题描述 投票:0回答:2

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

现在在其中一个课程中,我正在尝试做这样的事情...

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个专业化才能处理每个可选组件中void的不同组合职位。

到目前为止,我提出的最好方法是创建一个空类(在这种情况下为NullComp),该空类实现基本接口,但不执行任何操作,并且当用户不希望将组件功能作为其一部分时被用户替换。模板类。根据编译器的优化级别,将要生成的大多数代码都经过优化,但是我希望能够保证一开始就不会创建任何代码。 。

所以我的问题基本上可以归结为模板中是否有任何方法可以选择将字段声明为类的一部分。即,有某种技术可以将std :: enable_if与方法结合使用。

或者,我只是尝试做错了,有一种简单而优雅的方法来构成模板,使用一些完全不同的技术可以达到相同的最终目标。

c++ templates stl std
2个回答
0
投票
  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>
{
};

0
投票

这是使用条件继承的一种可能的解决方案。

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
};

对于太多字段,这很麻烦。也许有一种方法可以使我没想到的这种变化。

© www.soinside.com 2019 - 2024. All rights reserved.