要在for循环中更改的模板参数? 我有一个问题(我想)C++(在C++ 11之前,我现在不能升级)模板编程(和“特性”)。

要在for循环中更改的模板参数? 我有一个问题(我想)C++(在C++ 11之前,我现在不能升级)模板编程(和“特性”)。,c++,templates,c++11,C++,Templates,C++11,我的目标是: 我有不同(但非常相似)的类(已经从具有新功能和成员的基类派生出了类) 我编写了一个模板类,它继承了这些类中的任何一个,并使用多态函数“open”从数据库中收取与特定类相关的所有成员和信息 我之所以想到这个策略,是因为我想使用这个实例化类(及其所有成员)作为其他函数的输入。 我本来可以用switch/case架构来实现它(我想..但是这里我的模板类可以从模板参数中的类继承…),但是我想在这里避免它,因为它在以后已经被大量使用了 例如,我有Derived1和Derived2类(在一个D

我的目标是:

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

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

我之所以想到这个策略,是因为我想使用这个实例化类(及其所有成员)作为其他函数的输入。 我本来可以用switch/case架构来实现它(我想..但是这里我的模板类可以从模板参数中的类继承…),但是我想在这里避免它,因为它在以后已经被大量使用了

例如,我有Derived1和Derived2类(在一个Derived.hpp文件中定义),它们覆盖其根父类的函数open。 我有一个模板函数MyClass,它曾经像 MyClasscurrentClass(),或 MyClasscurrentClass()实现了我想要的功能(下面的代码)

问题:

有没有可能写一些东西让我可以做一个for循环?

差不多

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

模板在编译时实例化,
for()
循环在运行时求值。
所以不,你不能这么做

要在模板定义上“循环”,您可以使用以下结构:

template<int N>
struct A {
     typedef A<N - 1> X;
};

template<>
struct A<0> {
     typedef void X;
};
模板
结构A{
typedef A X;
};
模板
结构A{
typedef void X;
};

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

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)...};
}
模板
void do_job()
{
//一种类型的工作
//MyClass当前类;
// ...
}
模板
void do_jobs()
{
//按顺序展开类型的技巧
std::初始值设定项_列表{(do_job(),0)…};
}
并称之为:

do_jobs<Derived1, Derived2>();
do_jobs();

@MyName希望还没有破灭。看我的更新。嘿,这真聪明!我需要更好地理解你的观点。。。但是,一定要深入挖掘。当然@MyName THX;-)。这不是一个很聪明的例子,但你似乎掌握了重点。这种技术通常被称为。最有前途的例子之一是如何使用这种技术创建阶乘值。
template<int N>
struct A {
     typedef A<N - 1> X;
};

template<>
struct A<0> {
     typedef void X;
};
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>();