是否可以访问 c++ 模板模板常量参数
Is it possible to access a c++ template template constant parameter?
我想做这样的事情:
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"参数
例如
一般类:
template<template<int d, class>
class container>
class MyClass {
};
规格.class:
template<>
class MyClass<vec> {
vec c; // Error: vec needs template parameters
};
这给了我一个错误,因为我使用了我的模板类"vec",我希望编译器能够推断模板参数,例如当我使用
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;
};
。再次抱歉,最初的问题不够具体:)
我认为你所做的没有意义,所以答案是"不"。
模板参数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>
是一个类。听起来您可能根本不需要模板作为模板参数。
通常容器会暴露 dim 成员,因此这将起作用:
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;
下面是一个解决方法,您必须将这两个参数定义为容器类公开的类型和静态(请参阅示例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;
}
- 如何创建长度由常量参数指定的数组
- 通过常量引用传递参数的矩阵模板类
- 具有常量引用参数的函数模板专用化
- 使用自动推导的 lambda 参数作为常量表达式
- C++:常量引用参数
- 常量参数"real"常量吗?
- 常量参数存储在哪里 (C++)?
- 常量函数,当其参数是对文字类型的引用时
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 必须非常量别名参数及其默认参数常量
- 字符串参数常量字符* 和常量 wchar_t*
- 可选参数常量引用重新分配
- 推导模板化类参数的模板参数:常量问题
- 从函数参数常量字符串 (&) 设置值
- 为什么我必须声明这些引用参数常量或按值传递
- C++使用一个参数常量重载
- 如果要执行const_cast,为什么要制作参数常量?
- 模板非类型参数常量限制筛选器库
- 标记方法指针/引用参数常量真的会显著影响性能吗
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?