可变模板——从另一个类生成一个c++类
variadic templates - Generate a C++ class from an other one
我想从class X
生成class Y
:
class X{
T e;
optional<T1> e1;
optional<T2> e2;
optional<T3> e3;
T4 e4;
// Member functions
...
};
class Y{
T e;
T1 e1;
T2 e2;
T3 e3;
T4 e4;
bool b1;
bool b2;
bool b3;
// Member functions
...
}
所以,基本上我想把可选的布尔值放在最后来赢得一些内存,(这被称为打包)你可以假设成员函数不使用任何可选的,所以生成的代码将是正确的,而且类可以有尽可能多的可选
我知道c++中没有类反射,但是使用可变模板,似乎我们可以做一些很棒的事情。
我一直在想用它们来解决这个问题,但是我找不到任何解决方案。我想别人可能也做过这样的事。
编辑:这样做的主要目标是减少第一个类的内存,通过将可选的布尔值放在最后(减少填充),派生不会这样做,因为derived class
的size
将大于base class
ClassGenerator<X>
来生成,或者生成器可以接受像这样的更多参数ClassGenerator<X, T1, T2, T3>
基本上,我想把optional的布尔值放在最后来赢得一些内存,
回收内存的最好方法是将它们声明为位域,或者手动执行等效的按位算术。
这个问题可以通过使用可变模板和按位算术来解决。要聚合成员可以使用std::tuple
,聚合位可以使用std::bitset
。从这里,您可以创建一个按值返回optional
的访问器。
可以假设成员函数不使用任何可选函数,因此生成的代码将是正确的
没有成员函数
你可能高估了c++在类型转换方面给你的自由。例如,不能将X*
转换为Y*
。不可能。(至少,如果您使用Y*
结果,则不会。)
真的,困难的部分是你没有optional
了,你需要重新发明它。所以你需要某种形式的联盟,但单独的联盟不知道如何移动或摧毁自己,因为他们需要这一点。所以你不能把它们放在tuple
中,所以你也需要重新设计tuple
。
template< typename t >
union storage {
t value;
storage() {} // uninitialized
storage( t in ) : value( std::move( in ) ) {}
// Impossible to define the copy/move constructor.
~ storage() // Impossible to define. Destroy value or not?
};
template< typename ... elem >
class optional_tuple {
std::tuple< storage< elem > ... > e
std::bitset< sizeof ... (elem) > b;
optional_tuple( std::optional< elem > ... v )
: e{ std::move( v ) ... }
, b{ (bool) v ... }
{}
}
};
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '