gpt4 book ai didi

C++ Placement 新模板

转载 作者:太空狗 更新时间:2023-10-29 23:03:16 25 4
gpt4 key购买 nike

背景

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

问题

如何使用 C++ 模板在编译时确定最大的 State 子类的大小,以便创建一个适当大小的静态数组?我知道这是可能的,因为 TouchGFX (an embedded C++ GUI library)使用完全相同的技术来管理其 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);
};

关于C++ Placement 新模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26243825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com