C ++放置新模板

时间:2014-10-07 19:36:29

标签: c++ templates sizeof

背景

我正在开发一个嵌入式C ++项目,我正在使用继承构建一个简单的状态机。我们的想法是每个状态都将继承一个名为State的基类,状态管理器将在状态转换期间创建和销毁子类实例。为了避免使用堆,我想使用带有静态分配数组的 placement new

问题

如何在编译时使用C ++模板来确定最大State子类的大小,以便创建适当大小的静态数组?我知道这是可能的,因为TouchGFX (an embedded C++ GUI library)使用完全相同的技术来管理其Presenter和View子类实例。

1 个答案:

答案 0 :(得分:1)

关于touchGfx

的内容

我认为

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