2014-10-07 3 views
3

ФонC++ Размещение Новые шаблоны с

Я работаю на встроенный проект C++, в котором я в здании простой государственной машины с помощью наследования. Идея состоит в том, что каждое состояние наследуется от базового класса State, а диспетчер состояний будет создавать и уничтожать экземпляры подкласса во время переходов состояния. Чтобы избежать использования кучи, я хотел бы использовать размещение нового со статически выделенным массивом.

Вопрос

Как бы один использовать C++ шаблоны, чтобы определить размер самого большого государственного подклассу во время компиляции, для того, чтобы создать нужного размера статического массива? Я знаю, что это возможно, потому что TouchGFX (an embedded C++ GUI library) использует тот же самый метод для управления экземплярами подкласса Presenter и View.

+0

Может быть что-то что-то и в 'union' со всеми возможными экземплярами и размахиванием рук, а затем 'sizeof'' union'? –

+0

Вы действительно избегаете кучи, это на самом деле победа? –

+0

Если вы можете использовать boost, вы можете рассмотреть boost :: variant <>. Но тогда, если вы сможете использовать boost, вы обнаружите, что они уже создали для вас шаблонный конечный автомат: http://www.boost.org/doc/libs/1_55_0/libs/msm/doc/HTML/index.html –

ответ

1

относительно того, что делается в touchGfx

Я думаю, что

typedef meta::TypeList< MainView, 
         meta::TypeList< LeftView, 
         meta::TypeList< RightView, 
         meta::TypeList< DownView, 
         meta::TypeList< UpView, 
         meta::Nil > > > > 
         > ViewTypes; 

часть для некоторой цели я не во всем мире понимают, однако этот трюк он может знать, максимальный размер его место

В коде

код (simplifyied именно то, что вы хотите):

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

Редактировать

Это был мой код, или то, что я могу сделать, чтобы организовать то, что вы хотите, но список типов, безусловно, Somthing так:

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

'sizeof()' не всегда работает с 'std :: vector ' –

Смежные вопросы