使用C++中的模板声明可选的类字段
Declaring an optional class field using templates in C++
我在嵌入式环境中使用模板,需要静态声明所有内容。我想知道是否有任何方法可以使用模板或类似的技术在类中声明可选字段。
现在,在其中一节课上,我正在尝试做这样的事情。。。
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
};
对于太多的字段来说,这会变得很麻烦。也许有一种方法可以让这个变种,我没有想过。
- 您可以对其进行部分专门化:
template<class Filter> class MeasurementChannel<Filter, void> {};
- 或者,为了不将所有类代码复制到部分专门化,您只能专门化相关部分:
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>
{
};
相关文章:
- 声明没有默认构造函数的字段
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- python.clang AST 解析:获取字段声明的 c++ 模板参数
- 如何在不混淆字段的情况下声明复数?
- 错误:变量或字段'PrintEntity'声明无效无效打印实体(实体 e);
- C++ SPDLOG 编译错误:变量或字段"set_error_handler"声明为无效
- 何时在抽象类 cpp 中声明受保护的字段
- 声明为类字段而不是全局变量
- 带有 std::map 的模板函数给出错误:变量或字段声明为 void
- 视觉错误:变量或字段'Palindrome'在 C++ 中声明为 void
- 字段在正向声明中具有不完整的类型
- 声明为无效的变量或字段'name of var'
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- 声明为无效的变量或字段'Function'
- 是否必须在内存中"next to each other"两个相邻声明的公共字段?
- C 中应该如何声明类字段
- 错误 - 根据 G++ 未声明的继承类字段
- C++错误"变量或字段声明为无效"
- C :删除在堆栈上声明的结构的字段
- C++ 结构中的位字段声明