【问题标题】:Is it possible to access a c++ template template constant parameter?是否可以访问 C++ 模板模板常量参数?
【发布时间】:2012-06-27 08:53:38
【问题描述】:

我想做这样的事情:

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 {
};

规格。类:

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;
};

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

【问题讨论】:

  • 您实际上想要完成什么?显然你的做法是错误的,但如果不了解更多潜在问题,就很难给你有用的建议。
  • 你有完整的可编译程序吗?
  • @stijn:完成。谢谢,我没有注意到我的评论暗示了对所提问题的具体回答:-)

标签: c++ class templates constants


【解决方案1】:

我不认为你在做什么有意义,所以答案是“不”。

模板参数container 是一个类模板,而不是一个类。当MyClass 被实例化时,它的参数是整个模板,而不仅仅是它的一个实例。所以不可能将MyClass 的维度默认为“container 的维度”,因为container 没有自己的模板参数值。您的类MyClass 可以创建和使用container 的一个或多个实例,其具有不同的d 值,但没有特别给出其中任何一个,而是给出了模板。

以此类推,假设您将函数指针f 作为参数传递给函数g。然后您不能在g 的定义中使用“传递给f 的参数”。函数g 可以使用不同的参数调用f 一次或多次,但它并没有特别给出任何一次调用,而是给出了函数。

根据您的更新:

例如当我使用MyClass&lt;vec&lt;3, float&gt; &gt;

你不使用MyClass&lt;vec&lt;3, float&gt; &gt;,没有这样的东西。正如我所说,MyClass 采用 template 而不是 class。 vec 是一个模板,vec&lt;3, float&gt; 是一个类。听起来您可能根本不需要模板作为模板参数。

【讨论】:

  • 感谢您的澄清!我使用 stijn 提出的解决方案,但您的回答指出了我的推理错误。非常感谢。
【解决方案2】:

通常容器会暴露 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;

【讨论】:

  • 这正是我试图避免的,我不想指定尺寸和类型两次,例如MyClass, 2, float>
  • 根本不需要(在您的示例中也不合法)。我建议的语法是MyClass&lt; vec, 2, float &gt; x;
【解决方案3】:

以下是一种解决方法,您必须将两个参数定义为容器类公开的 type 和 static(例如参见 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多