在C ++中初始化具有相同名称的不同模板

时间:2014-01-09 17:09:00

标签: c++ class initialization

我有一个用C ++编写的程序,用户可以从显微镜图像中分割出一些细胞。完成后,程序将获得三个总体参数进行更改。这三个人是featureclassifierreductionMethod

这些参数中的每一个都是作为初始化时相同的模板。我认为我可以通过以下实现来调用它:

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

但这是不可能的,因为workingFeature语句中初始化了if-else。我怎么能这样做呢?我不习惯用C ++编程。

2 个答案:

答案 0 :(得分:3)

使其工作的一种方法是将代码移动到具有模板参数的函数中,该模板参数采用您要处理的要素类型。样品:

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

然后你这样打电话:

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

答案 1 :(得分:0)

两个模板都可以有一个公共基类,然后你可以创建一个base类型的指针,然后在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);

您没有为函数指定参数类型,但显然它们需要在类定义中存在。