我可以有一个模板列表来实例化,而无需事先实例化吗?

时间:2016-02-02 17:42:34

标签: c++ templates

不确定如何最好地说出这个问题。我的内存,堆栈空间有限,没有堆,没有std;这导致需要在堆栈上存在所有内容。

我有一些可能非常大的对象(请从我的小例子中推断出来,请在“初始化期间只做各种类型的静态实例”的回答是错过了我的问题)。

代码示例可能效果最好:

template <typename T1, typenameT2>
class Foo {
    public:
    void doStuff(int index) {
        switch (index) {
        case 0: {
            T0 t;
            t.run();
            break;
        }

        case 1: {
           T1 t;
           t.run();
           break;
        }
        // etc; there are more than a couple.
}

最终,我更喜欢做的事情是:

void doStuff(int index) {
    // sanity check index first;
    myTemplates[index] t;
    t.run();
}

正如我设置的那样,我显然没有mytemplates数组;这是我的问题 - 我可以做那样的事情,而不是有这么大的,重复的switch - 陈述吗?

我意识到我无法创建实例化类型的实际数组,因为类型不同,这就是重点。即使我可以,我也不想要一个 instantiations 数组,我想要一个模板类型的“数组”。

如果相关,我的所有类型T0T1等都来自同一个基础。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

template <typename Ts...>
struct doStuffHelper
{
    template <typename T>
    static void doStuffT()
    {
        T t;
        t.run();
    }

    void operator () (std::size_t i) const
    {
         std::array<void(*)(), sizeof...(Ts)> fs {&doStuffT<Ts>...};

         fs[i]();
    }

};

void doStuff(int index) {
    doStuffHelper<T0, T1 /*, ..*/>{}(index);
}