背景
我正在开发一个嵌入式C ++项目,我正在使用继承构建一个简单的状态机。我们的想法是每个状态都将继承一个名为State的基类,状态管理器将在状态转换期间创建和销毁子类实例。为了避免使用堆,我想使用带有静态分配数组的 placement new 。
问题
如何在编译时使用C ++模板来确定最大State子类的大小,以便创建适当大小的静态数组?我知道这是可能的,因为TouchGFX (an embedded C++ GUI library)使用完全相同的技术来管理其Presenter和View子类实例。
答案 0 :(得分:1)
我认为
typedef meta::TypeList< MainView,
meta::TypeList< LeftView,
meta::TypeList< RightView,
meta::TypeList< DownView,
meta::TypeList< UpView,
meta::Nil > > > >
> ViewTypes;
部分是出于某些目的我不全球了解,但是通过这个技巧,它可以知道它的最大尺寸
代码(完全符合您的要求):
#include <stdlib.h>
#include <iostream>
template<typename ...All>
struct maxSize;
template<typename Member>
struct maxSize<Member>{
static const size_t member_size = sizeof(Member);
static const size_t size = member_size;
};
template <typename Member, typename... Rest>
struct maxSize<Member, Rest...> : maxSize<Rest...>{
static const size_t member_size = sizeof(Member);
static const size_t size = (member_size > maxSize<Rest...>::size ? (member_size) : (maxSize<Rest...>::size));
};
template<typename... sizeMax>
void* allocSpace() {
return new char [maxSize<sizeMax...>::size];
}
int main(){
allocSpace<char, char[10], int, double>();
std::cout << maxSize<char, char[10], int, double>::size << " " << sizeof(int) << std::endl;
}
这是我的代码,或者我可以做些什么来安排你想要的东西,但类型列表肯定是这样的:
struct NIL{
static const size_t size =0;
};
template<typename Member, typename Tail>
struct typeList{
static const size_t size = Tail::size > sizeof (Member) ? Tail::size : sizeof(Member);
};