是否可以访问c ++模板模板常量参数?

时间:2012-06-27 08:53:38

标签: c++ class templates constants

我想做这样的事情:

template<template<int d, class>
         class container,
         int dim = d, typename content_data_type>
class MyClass {
};

我的编译器告诉我这是不可能的,因为“d”没有定义在:

之外
template<int d, class> class container

还有其他方法吗?

提前感谢您对此主题的任何帮助。

更新

@ Rook:我希望稍后在专业化中访问“dim”和“content_data_type”参数

e.g。

普通班:

template<template<int d, class>
         class container>
class MyClass {
};

规格。类:

template<>
class MyClass<vec> {
    vec c; // Error: vec needs template parameters
};

这给了我一个错误,因为我使用了我的模板类“vec”whitout模板参数,我希望编译器推导出模板参数,例如当我使用

MyClass<vec<3, float> >

然后变量“c”应该具有类型

vec<3, float>

因为这不起作用,我想我可以创建两个激活模板参数“dim”和“content_data_type”,我可以在这样的专业化类中访问:

template<template<int d, class t>
     class container,
     int dim = d, typename content_data_type = t>
class MyClass<vec> {
    vec<dim, content_data_type> c;
};

...再次抱歉,对于最初的问题不够具体:)

3 个答案:

答案 0 :(得分:3)

我认为你所做的事情没有意义,所以答案是“不”。

模板参数container类模板,而不是类。当MyClass被实例化时,它的参数是整个模板,而不仅仅是它的一个实例。因此,无法将MyClass的维度默认为“container的维度”,因为container没有自己的模板参数的值。您的班级MyClass可以使用container的不同值创建和使用d的一个或多个实例,但特别是没有给出任何一个,它会给出模板。< / p>

通过类比,假设您将指向函数的指针f作为参数传递给函数g。然后,您无法在f的定义中使用“传递给g”的参数。函数g可以使用不同的参数调用f一次或多次,但特别是没有任何一个调用,它被赋予了函数。

来自您的更新:

  

e.g。当我使用MyClass<vec<3, float> >

你不使用MyClass<vec<3, float> >,没有这样的事情。正如我所说,MyClass需要模板而不是vec是一个模板,vec<3, float>是一个类。听起来好像你根本不需要模板作为模板参数。

答案 1 :(得分:2)

通常容器会暴露暗淡的成员,所以这可以工作:

template< template< int, class> class container, int dim, class content_data_type >
class MyClass 
{
public:
  typedef typename container< dim, content_data_type > container_type;

  static const int dim = container_type::dim;
};

template< int d, class >
class acontainer
{
public:
  static const int dim = d;
};

MyClass< acontainer, 2, sometype > x;
std::cout << "container size " << x.dim << std::endl;

答案 2 :(得分:0)

下面是一种解决方法,您必须将两个参数定义为容器类公开的类型静态(请参阅示例boost::array

#include <iostream>

template <int d, class T>
struct container
{
  typedef T value_type;
  static const int static_size = d;
};

template<typename cont, int d = cont::static_size, class T = typename cont::value_type>
struct A
{
  static const int dimension = d;
};

int main(void)
{
  A<container<10, int> > a;
  std::cout << a.dimension << std::endl;
}
相关问题