访问嵌套模板参数

时间:2014-11-21 12:25:12

标签: c++ templates

我目前正面临一个嵌套模板参数的问题,我想访问它,但我不确定这是否可行。以下是对问题的描述:

我有一个库中的“直方图”,我没有影响。该课程如下:

template<int N>
struct Histogram
{
  float histogram[N];
  static int descriptorSize() { return N; }
};

现在我想创建自己的主成分分析类,它应该能够处理任意大小的直方图:

template<template<typename> class HistogramT> 
class PCA {

  // I'd like to pass on the nested template parameter here
  typedef typename Matrix< float , N , N > MatrixNf;

  // ...
}

该类的最终实例化如下:

PCA<Histogram<153> > pca;

我现在的问题是,如何或者甚至可以访问我的PCA课程中Histogram<int N>的模板参数N?

3 个答案:

答案 0 :(得分:4)

如果你想这样做:

PCA<Histogram<153> > pca;

然后PCA应为:

template <typename Histogram>
class PCA { ... };

因为Histogram<153>是完整类型,而不是模板。至于如何获得这个数字?只需写一个类型特征:

template <typename T> struct get_histogram_size;

template <int N>
struct get_histogram_size<Histogram<N> > {
    static const int value = N;
}

用法:

template <typename Histogram>
class PCA { 
    static const int N = get_histogram_size<Histogram>::value;
    typedef typename Matrix< float , N , N > MatrixNf;
    // ...
};

答案 1 :(得分:3)

template <class T> 
class PCA;

template <int N> 
class PCA<Histogram<N> >
{
    typedef typename Matrix< float , N , N > MatrixNf;
    // ...
};

PCA<Histogram<153> > pca;

答案 2 :(得分:1)

首先,您的模板模板参数不正确。它应该有int而不是typename

template<template<int> class HistogramT> 
class PCA 

但现在你不能写

PCA<Histogram<154>>

因为Histogram<154>不是模板,所以它是一个类。我建议您只需添加另一个参数,如下所示:

template<template<int> class HistogramT, int N> 
class PCA 

并使用

PCA<Histogram, 154>

直方图模板编写得不是很好。如果是,它将提供类似的东西:

static const int size = N;

在里面,所以你可以这样做:

 template<class HistT>
    class PCA
    {
        //here, use HistT::size for N.
    }