以下是示例:
template <int n>
class A { };
class B {
public:
int foo() {
return a.n; // error
}
private:
A<10> a;
};
我希望在模板A<10>
以外的类B
中获取实例化类A
的非类型模板参数的值,有没有办法做到这一点?或者我应该使用其他一些设计来避免这个问题?
答案 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
。