Метапрограммирование шаблонов c ++: как создавать и повторять список типов, которые являются & quot; typedefs & quot; в шаблонном классе.

Мой код — это фабрика, которая создает объекты на основе типов из параметров шаблона. Я хочу расширить это до «списка» типов.

Вот что у меня есть: Algo1 определяет тип indata, FASSubscriberFactory::Create() возвращает указатель на FASSubscriber<Algo1::indata,..> . Посмотреть здесь:

struct Algo1
{
typedef DataType1 indata;
}

template <class T, class FEED = T::indata, class PROC = typename ProcessorFactory<T>::ptype>
struct FASSubscriberFactory
{
typedef FASSubscriber<typename PROC , typename FEED > fftype;

static fftype * Create()
{
return new fftype(FASConfig::Data2Feed<FEED>::name, ProcessorFactory<T>::Create());
}
}

void main()
{
auto myFASSubscriber4Algo1 FASSubscriberFactory<Algo1>::Create();
}

Это то, что я хочу: Algo1 определяет список typedefs indata, FASSubscriberFactory::CreateList() возвращает указатель на список FASSubscriber<Algo1::indata,..> для каждого введите Algo1:indata. Смотрите // комментарии в псевдокоде ниже.

struct Algo1
{
//Want to define a list of types
typedef std::list<types> indata = { DataType1, DateType2 }
}

template <class T, class FEEDs = T::indata, class PROC = typename ProcessorFactory<T>::ptype>
struct FASSubscriberFactory
{
//want to create a list FASSubscribers from list of types T::indata
typedef list<FASSubscriber<PROC, FEEDs::type> listoffftypes
static lisoftypes * CreateList()
{
listoffftypes mylot();

//for each type in FEEDs - want to lopp around list of types
foreach(feedtype in FEEDs )
{
mylot.push(Create<feedtype>());
}
return mylot;
}

template <class FEED>
static fftype * Create()
{
typedef FASSubscriber<typename PROC , typename FEED > fftype;

return new fftype(FASConfig::Data2Feed<FEED>::name, ProcessorFactory<T>::Create());
}
}

void main()
{
auto myListOfFASSubscriber4Algo1 FASSubscriberFactory<Algo1>::Create();
}

Все, что мне действительно нужно, — это способ определения и перебора «списка типов», который определен в классе аргумента шаблона. Взглянул на ТИПЕЛИСТЫ А. Алекса, но я не видел петель.

Спасибо
J

1

Решение

У меня есть чувство разнообразия шаблонов и std::tuple от C ++ 11 — это то, что вы хотите, хотя я не совсем уверен, что понимаю, о чем вы спрашиваете.

// returns a tuple of pointers created by a Create for each type in the parameter pack
template<typename... TS>
static std::tuple<TS*...> CreateList() {
return { Create<TS>()... };
}

Пожалуйста, не описывайте метапрограммирование шаблона в терминах обычного кода C ++; это сбивает с толку.


Например, если вы назвали это так:

FASSubscriberFactory</* stuff */>::CreateList<int, float, foo, bar>()

По сути, это будет делать это:

static std::tuple<int*, float*, foo*, bar*> CreateList() {
return { Create<int>(), Create<float>(), Create<foo>(), Create<bar>() };
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector