2012-06-27 67 views
4

我想要做这样的事情:是否可以访问C++模板模板常量参数?

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

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

template<int d, class> class container 

是否有这样做的,也许另一种方式这个 ?

在此先感谢您对此主题的任何帮助。

UPDATE:

@鲁克:我想稍后访问一个特

例如在 “模糊” 和 “content_data_type” 参数

一般类:

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

规格。类:

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

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

MyClass<vec<3, float> > 

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

vec<3, float> 

因为这个没有工作,我想我可以创建两个excplicit模板paramters“暗淡”和“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; 
}; 

...又难过:)

:我可以在专业化类像这样访问210
+0

你究竟在做什么?很明显,你会以错误的方式去解决问题,但如果不了解更多关于潜在问题的信息,就很难给出有用的建议。 – Rook

+0

你有一个完整的可编译程序吗? –

+0

@SteveJessop可能发布,作为一个答案无论如何..OP中的标题问题的答案显然是'没有'因为你说 – stijn

回答

3

我不认为你在做什么是有道理的,所以答案是“不”。

模板参数container类模板,不是类。当MyClass被实例化时,它的参数是整个模板,而不仅仅是一个实例。因此,不可能将MyClass的尺寸默认为“尺寸container”,因为container不具有其自己的模板参数的值。您的类MyClass可以创建并使用具有d的不同值的container的一个或多个实例化,但并未给出它们中的任何一个,因为它是给定模板的。

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

从您的更新:

例如当我使用MyClass<vec<3, float> >

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

+0

感谢您的澄清!我使用stijn提出的解决方案,但你的回答指出了我在推理中的错误。非常感谢你。 – amonsch

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; 
+0

这正是我想要避免的,我不想指定尺寸并输入两次,例如MyClass ,2,float> – amonsch

+0

根本不需要(在你的例子中也不合法)。我建议的语法是'MyClass x;' – stijn

+0

我明白了,对不起:) – amonsch

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; 
} 
相关问题