2

我的代码是一个工厂,它根据模板参数的类型创建对象。我想将此扩展到“类型列表”。

这就是我所拥有的: Algo1定义一个 type 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定义一个 typedefs 列表 indataFASSubscriberFactory::CreateList()返回一个指向foreach类型列表的指针。请参阅下面的伪代码中的//注释。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();
}

我真正想要的是一种定义和迭代模板参数类中定义的“类型列表”的方法。看了一下 A. Alexa 的 TYPELISTS,但我没有看到任何循环。

谢谢j

4

1 回答 1

1

我有一种感觉可变参数模板和std::tupleC++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>() };
}
于 2012-12-13T08:51:44.107 回答