要在for循环中更改的模板参数?

时间:2014-12-08 12:22:21

标签: c++ templates c++11

我有一个问题(我认为)C ++(在C ++ 11之前,我现在无法升级)模板编程(以及“traits”)。

我的目标:

我有不同的(但非常相似)类(已经从具有新功能和成员的基类派生的类)。

我编写了一个Template类,它继承自这些类中的任何一个,并使用多态函数“open”从数据库中收取与特定类相关的所有成员和信息。

我想到了这个策略,因为在我想使用这个实例化的类(及其所有成员)作为其他函数的输入之后。 我本可以做到这一点(我认为..但这里我的模板类可以继承模板参数中的类...),带有开关/案例架构,但我想在这里避免它,因为它之后已经大量使用了。

例如,我有类Derived1和Derived2(在Derived.hpp文件中定义),它们覆盖其Root父类的函数open。 我有一个曾经使用过的模板函数MyClass     MyClass< DerivedType1> currentClass(),或     MyClass< DerivedType2> currentClass()做我想要的(下面的代码)。

问题:

是否可以编写一些可以进行for循环的内容?

这样的东西
For (auto i=1; i<N; ++i)
{ 
MyClass<DerivedType[i]> currentClass();
--- other things to do with my currentClass ---
}

对我来说,我的DerivedType(s)是“type”(请参阅​​下面traits.hpp片段中的struct),我甚至不知道是否可以将它们放在容器中(如矢量)... 也许在C ++ 11中我可以为所有DerivedTypes定义一个枚举类(是真的吗?),但这里有C ++ 03?

完全失败了,我承认......

非常感谢您提出任何建议。

(工作)主

(包括“MyClass.hpp”)

int main(int, char* [])
{

GlobalClass GlobalItem();  //global class encapsulating all the info of each item from the database

//connection to the database
//DerivedType1 case

MyClass<DerivedType1> CurrentClass();
GlobalItem.AddCurrentClass();

//with a for loop or the like I can use the fact that at each loop the class is declared only inside the { … } and then each time the destructor
//is automatically called
CurrentClass.clear();
CurrentClass = MyClass<DerivedType2>();
GlobalItem.AddCurrentClass();

return 0;
}

这是模板类MyClass.hpp:

(包括“traits.hpp”)

template <class Traits>
       class MyClass : public Traits::type
       {
       private:
             typedef typename Traits::type BaseType;

       protected:
             std::string         currentType_;


       public:
             //constructor
             MyClass() : BaseType() { this->open() }

//destructor
             virtual ~MyClass();
       };

这里是scope :: operator

运行的traits.hpp文件

(包括&#34; Derived.hpp&#34;)

    struct DerivedType1 {
                    typedef Derived1 type;
       };

       struct DerivedType2 {
            typedef  Derived2 type;
       };

2 个答案:

答案 0 :(得分:3)

模板在编译时实例化,for()循环在运行时进行评估 所以不,你不能这样做。

“循环”而不是模板定义,您可以使用像

这样的结构
template<int N>
struct A {
     typedef A<N - 1> X;
};

template<>
struct A<0> {
     typedef void X;
};

答案 1 :(得分:1)

使用可变参数模板,您可以执行以下操作:

template <typename T>
void do_job()
{
    // job for one type

    // MyClass<T> currentClass;
    // ...
}


template <typename ... Ts>
void do_jobs()
{
    // trick to unroll the types sequentially
    std::initializer_list<int>{(do_job<Ts>(), 0)...};
}

并称之为:

do_jobs<Derived1, Derived2>();