在 C++ 中使用模板声明一个可选的 class 字段
Declaring an optional class field using templates in C++
我在需要静态声明所有内容的嵌入式环境中使用模板。
我想知道是否有任何方法可以使用模板或类似技术在 class 中声明可选字段。
现在,在其中一个 classes 中,我正在尝试做这样的事情...
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 的不同组合的可选职位。
到目前为止我想出的最好方法是创建一个 null class(在本例中为 NullComp),它实现了基本接口但什么也不做,并在用户不需要时被替换该组件功能作为模板化 class 的一部分。根据编译器优化级别,将生成的大部分代码都被优化掉了,但我希望能够保证首先不会创建任何内容。 .
所以我的问题基本上归结为在模板中是否有任何方法可以选择性地将字段声明为 class 的一部分。即是否有一些技术可以提供等同于使用 std::enable_if 方法的方法。
或者我只是想做错这个,有一种简单优雅的模板组合方式,它使用一些完全不同的技术达到相同的最终目标。
- 你可以部分特化它:
template<class Filter> class MeasurementChannel<Filter, void> {};
- 或者,为了不将所有 class 代码复制到部分特化,您可以只特化相关部分:
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>
{
};
这是一个可能的解决方案,使用条件继承。
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
};
对于太多的字段,这会变得很麻烦。可能有一种方法可以使我没有想到的可变参数。
我在需要静态声明所有内容的嵌入式环境中使用模板。 我想知道是否有任何方法可以使用模板或类似技术在 class 中声明可选字段。
现在,在其中一个 classes 中,我正在尝试做这样的事情...
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 的不同组合的可选职位。
到目前为止我想出的最好方法是创建一个 null class(在本例中为 NullComp),它实现了基本接口但什么也不做,并在用户不需要时被替换该组件功能作为模板化 class 的一部分。根据编译器优化级别,将生成的大部分代码都被优化掉了,但我希望能够保证首先不会创建任何内容。 .
所以我的问题基本上归结为在模板中是否有任何方法可以选择性地将字段声明为 class 的一部分。即是否有一些技术可以提供等同于使用 std::enable_if 方法的方法。
或者我只是想做错这个,有一种简单优雅的模板组合方式,它使用一些完全不同的技术达到相同的最终目标。
- 你可以部分特化它:
template<class Filter> class MeasurementChannel<Filter, void> {};
- 或者,为了不将所有 class 代码复制到部分特化,您可以只特化相关部分:
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>
{
};
这是一个可能的解决方案,使用条件继承。
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
};
对于太多的字段,这会变得很麻烦。可能有一种方法可以使我没有想到的可变参数。