如何获取非类型模板参数的值?

时间:2016-03-05 12:08:11

标签: c++ templates

以下是示例:

template <int n>
class A { };

class B {
public:
  int foo() {
    return a.n;  // error
  }
private:
  A<10> a;
};

我希望在模板A<10>以外的类B中获取实例化类A的非类型模板参数的值,有没有办法做到这一点?或者我应该使用其他一些设计来避免这个问题?

3 个答案:

答案 0 :(得分:5)

您无法像这样访问其他类模板参数。另一个类必须公开它,例如:

template <int n>
class A {
public:
    static const int num = n;
};

然后您可以a.num(当然还是A<10>::num

来访问它

答案 1 :(得分:3)

如果您有成员A<10>,则您的班级B已经知道模板参数。请改用该值。如果模板参数确实未命名,则让A定​​义反映模板参数的成员。

1 -

class B {
public:
  int foo() {
    return n;  
  }
private:
  const int n = 10;
  A<n> a;
};

2 -

template <int n>
class A { 
public:
    static const int template_param = n;
};

答案 2 :(得分:1)

如果您无法获得合作类型(通过发布参数值),您可以使用特征类自行提取它:

template<class> struct A_param; // not defined

template<int N> struct A_param<A<N>> {
    static constexpr int value = N;
};

// a more general implementation would probably want to handle cv-qualified As etc.

然后使用A_param<decltype(a)>::value