1

我的代碼是一個基於模板參數中的類型創建對象的工廠。我想將其擴展爲「列表」類型。C++模板元編程:如何創建和遍歷模板類中「typedefs」類型的列表。

這是我有:Algo1定義類型indataFASSubscriberFactory::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定義的typedef indata的列表。 FASSubscriberFactory::CreateList()返回Algo1:indata指針FASSubscriber<Algo1::indata,..>的foreach類型的列表。請參閱下面的僞代碼中的評論。

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

我真正想要的是一種定義和迭代在模板參數類中定義的「類型列表」的方法。看看A. Alexa的TYPELISTS,但我沒有看到任何循環。

感謝 Ĵ

回答

1

我從C++ 11的感覺可變參數模板和std::tuple是你想要的,雖然我不能完全明白你在問什麼。

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

什麼是更好的方式來形容呢?在你的例子中TS是一個類型的集合?那麼預處理器是否爲TS中的每種類型創建了多種類型的CreateList <>? – jaybny

+0

好的,所以...運算符會爲每種類型產生一個新的代碼塊?嗯...有趣。但他們可以共享靜態變量嗎?需要閱讀可變參數模板。 ty – jaybny

+0

@jaybny我更新了它如何「擴展」。是的,請閱讀各種模板,嘗試一下,如果您有任何疑問,請告訴我。 – Pubby