2010-09-30 2 views
2

мне нужно повторно выполнять вызовы к функции шаблона с разными классами, определенными в других местах в коде, например, так:Как создать массив для хранения C++ классов (не экземпляров), которые будут использоваться итеративно в шаблонной функции

MyTemplateFunction<ClassOne>(&AnotherTemplateFunction<ClassOne>); 
MyTemplateFunction<ClassTwo>(&AnotherTemplateFunction<ClassTwo>); 
MyTemplateFunction<ClassThree>(&AnotherTemplateFunction<ClassThree>); 
MyTemplateFunction<ClassFour>(&AnotherTemplateFunction<ClassFour>); 

Есть ли способ создать массив специализаций для классов ClassOne, ClassTwo и т. Д., Поэтому я могу просто перебрать массив для лучшей ремонтопригодности.

Редактировать: Я специально использую функцию register_exception_translator в Boost.Python. Поэтому у меня нет выбора. Его сторонняя функция, которую я должен назвать для всех моих классов, которые в моем проекте более 50. Повторение вызовов, подобных этому, было бесполезным при добавлении или изменении классов.

+0

почему бы вам нужно сделать это? Возможно, вы ищете фабрику шаблонов: http://en.wikipedia.org/wiki/Factory_method_pattern –

+0

@ Loïc Février: Я добавил свою причину. Его сторонняя функция. – sarshad

ответ

3

Что-то вроде этого должно хватить

template<typename I, typename N> struct cons { }; 
struct nil { }; 

template<typename T, typename U> 
void call(cons<T, U>) { 
    MyTemplateFunction<T>(&AnotherTemplateFunction<T>); 
    call(U()); 
} 

void call(nil) { } 

typedef cons<ClassA, cons<ClassB, cons<ClassC, nil> > > conses; 
int main() { 
    call(conses()); 
} 
+0

+1: Для конкретных приложений ручная работа часто бывает проще, чем MPL. – Potatoswatter

+0

Это приятное решение без какой-либо дополнительной зависимости. И я узнал кое-что новое. Благодарю. – sarshad

4

Вы должны изучить Boost.MPL, в частности sequences.

+0

+1 Это, на мой взгляд, хороший вариант, если Boost.MPL использовался для решения более простой проблемы рефакторинга. Для моего случая я не хотел добавлять другую зависимость для очень маленькой проблемы. – sarshad

Смежные вопросы