С++ создает экземпляры шаблонов в цикле

У меня есть фабричный класс, которому нужно создать несколько шаблонов с последовательными параметрами шаблона, которые являются простыми целыми числами. Как я могу создать такие шаблонные функции, не разворачивая весь цикл?

Единственное, что можно придумать, это использовать boost pre-processor. Можете порекомендовать что-то еще, не зависящее от препроцессора?

Благодарность


person Anycorn    schedule 21.11.2009    source источник
comment
Можете ли вы опубликовать код, который разъясняет, что вы хотите? Как создавать экземпляры шаблонов?   -  person Konrad Rudolph    schedule 21.11.2009


Ответы (5)


Параметры шаблона должны быть постоянными во время компиляции. В настоящее время ни один компилятор не считает переменную счетчика цикла константой даже после ее развертывания. Вероятно, это связано с тем, что константность должна быть известна во время создания экземпляра шаблона, что происходит задолго до развертывания цикла.

Но можно построить «рекурсивный» шаблон и со специализацией в качестве конечного условия. Но даже в этом случае граница цикла должна быть постоянной времени компиляции.

template<int i>
class loop {
    loop<i-1> x;
}

template<>
class loop<1> {
}

loop<10> l;

создаст десять классов шаблонов от loop‹10> до loop‹1>.

person Gunther Piez    schedule 21.11.2009


Спасибо вам, ребята.

dr Hirsch наиболее близок к тому, что необходимо, но, в конце концов, предыдущее решение является самым чистым. Позвольте мне еще раз сформулировать проблему: несколько шаблонов должны были быть созданы во время компиляции с использованием постоянных параметров.

f0 = f<0,0>();
f1 = f<0,1>();
...
fk = f<m,n>();

для любого значительного числа m и n развертывание шаблона делает код более загруженным. С препроцессором boost я сделал следующее:


#include "boost/preprocessor/seq/for_each_product.hpp"
#include "boost/preprocessor/seq/to_tuple.hpp"


#define SEQ_MASK        (0x1)(0x3)
#define SEQ_M           (1)(2)
#define SEQ_N           (1)(2)

#define INSTANCE(r, tparams) {                                      \
            Kernel kernel = Instance<BOOST_PP_SEQ_ENUM(tparams)>(); \
            kernels[kernel.key()]  = kernel; }

        BOOST_PP_SEQ_FOR_EACH_PRODUCT(INSTANCE, (SEQ_MASK)(SEQ_M)(SEQ_N));

после запуска препроцессора он создает все комбинации из трех определенных последовательностей.

person Anycorn    schedule 21.11.2009

Я не думаю, что это возможно во время выполнения, потому что MyClass<1> и MyClass<2> - это абсолютно разные классы.

Но у меня есть одна идея: если вы знаете все возможные значения, вы можете написать switch в своем классе фабрики и передать это целое число в качестве параметра в фабрику.

person Elalfer    schedule 21.11.2009
comment
Если вы используете способ переключения, то будут созданы экземпляры всех классов. Невозможно только создать экземпляр того, который равен n (потому что, конечно, его значение неизвестно во время компиляции). - person Johannes Schaub - litb; 21.11.2009

Шаблоны создаются во время компиляции, а не во время выполнения, поэтому вы вообще не можете создавать их экземпляры в цикле.

person Clifford    schedule 21.11.2009
comment
Вы можете выполнять циклы/итерации с помощью компилятора. См. ответ @drhirsch выше. - person Macke; 21.11.2009
comment
Я согласен, что drhirsch предоставил решение, но это не цикл, а рекурсия, поэтому моя точка зрения остается в силе. Я пытался подчеркнуть, что шаблоны не создаются во время выполнения, что в некотором смысле служит объяснением ответа дрхирша. - person Clifford; 22.11.2009