开发者

c++ template of template

开发者 https://www.devze.com 2023-01-12 01:59 出处:网络
#include \"boost/numeric/ublas/matrix.hpp\" using namespace boost::numeric::ublas; template <class matrixform,class input_T>
#include "boost/numeric/ublas/matrix.hpp"
using namespace boost::numeric::ublas;
template <class matrixform,class input_T>
class Layer
{
private:
    matrixform <input_T>;
public:
};

I want to be able to do

int main ()
{
Layer<identity_matrix, double> mylayer;
}

BUT

layer.hpp:18: error: ‘matrixform’ is 开发者_运维问答 not a template layer.hpp:18: error: declaration does not declare anything


You would need to use a template template parameter:

template <template <class> class matrixform, class input_T>
class Layer { /* ... */ };

Note that in order to use a template template parameter, the template provided as an argument must have parameters that exactly match the list. So, in this example here, only a template taking one type parameter can be used to instantiate Layer.

This is a problem, especially since a class template parameter can have a default argument. The Boost identity_matrix class, for example, has two template parameters: the type and the allocator to be used, so it could not be used to instantiate Layer (the allocator parameter has a default argument).

What you can do instead is take as a template parameter the instantiated template to use, and get the input_T from a typedef defined by that type. For example:

template <typename MatrixT>
class Layer
{
    typedef typename MatrixT::value_type ValueT;
};

MatrixT here is what matrixform<input_T> is in your example, and ValueT is your input_T.

This can be instantiated as,

Layer<identity_matrix<double> > mylayer;


template <class templatedmatrixform> 
class Layer 
{ 
private: 
    templatedmatrixform matrix; 
public: 
}; 

 template<typename T>
 class identity_matrix
 {
       typedef T input_T;
 };


int main () 
{ 
    Layer<identity_matrix<double> > mylayer; 
} 
0

精彩评论

暂无评论...
验证码 换一张
取 消