簡體   English   中英

C ++放置新模板

[英]C++ Placement New with Templates

背景

我正在開發一個嵌入式C ++項目,我正在使用繼承構建一個簡單的狀態機。 我們的想法是每個狀態都將繼承一個名為State的基類,狀態管理器將在狀態轉換期間創建和銷毀子類實例。 為了避免使用堆,我想使用帶有靜態分配數組的placement new

如何在編譯時使用C ++模板來確定最大State子類的大小,以便創建適當大小的靜態數組? 我知道這是可能的,因為TouchGFX(嵌入式C ++ GUI庫)使用完全相同的技術來管理其Presenter和View子類實例。

關於在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);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM