2014-01-09 3 views
0

У меня есть программа, написанная на C++, где пользователь может сегментировать некоторые ячейки с изображения микроскопии. Когда это будет сделано, программа получит три общих параметра для изменения. Этими тремя являются feature, classifier и reductionMethod.Инициализировать разные шаблоны с тем же именем в C++

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

if (feature == 1) 
{ 
    FastColorIntensityGradientFeature<8> workingFeature(); 
} 
else if (feature == 2) 
{ 
    ColorIntensityGradientFeature<8> workingFeature(); 
} 
workingFeature(input, var, var); 

Но это невозможно, потому что workingFeature инициализируется в if-else заявлении. Как я могу это сделать? Я не привык к программированию на C++.

+0

Неправильно на нескольких фронтах, в том числе ни один из тех, кто фактически объявляет объекты; они объявляют функции. И мне кажется, что вам нужен базовый виртуальный класс, который корни оба шаблона, если вы хотите продолжить это. – WhozCraig

+0

Я удивлен, что это компилирует ... В любом случае вы можете отправить больше кода? – Keeler

+1

Я нахожу ваш вопрос немного неясным, и я, возможно, неправильно понял его, но я думаю, что вам нужно [Boost Variant class] (http://www.boost.org/doc/libs/1_55_0/doc/html/variant. HTML). – jrok

ответ

0

Оба шаблонов может иметь общий базовый класс, то вы можете создать указатель типа базы, а затем создать нужный ребенку в статья if.

class base 
{ 
public: 
    virtual void workingFeature(input, var, var); 
}; 

template<int num> 
class FastColorIntensityGradientFeature : public base 
{ 
public: 
    virtual void workingFeature(input, var, var); 
}; 


template<int num> 
class ColorIntensityGradientFeature: public base 
{ 
public: 
    virtual void workingFeature(input, var, var); 
}; 

, а затем изменить положение if на:

base * choice; 
if (feature == 1) 
{ 
    choice = new FastColorIntensityGradientFeature<8>; 
} 
else if (feature == 2) 
{ 
    choice = new ColorIntensityGradientFeature<8>; 
} 
else 
{ 
     // some error handling 
} 

choice->workingFeature(input, var, var); 

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

3

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

template <typename IntensityGradientFeature> 
void doWork() { 
    IntensityGradientFeature workingFeature; 
    workingFeature.doSomething(); 
} 

Затем вы вызываете этот путь:

if (feature == 1) 
    doWork< FastColorIntensityGradientFeature<8> >(); 
else if (feature == 2) 
    doWork< ColorIntensityGradientFeature<8> >(); 
+1

Или возьмите объект в качестве параметра функции шаблона, полагаясь на вычет типа. Затем вы можете передать аргументы конструктору на сайте вызова, если хотите. –

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