这里是例子:如何获取非类型模板参数的值?
template <int n>
class A { };
class B {
public:
int foo() {
return a.n; // error
}
private:
A<10> a;
};
我想在B
类比模板A
本身以外的实例化的类A<10>
的非类型模板参数的值,是有办法做到这一点?或者我应该使用其他一些设计来避免这个问题?
这里是例子:如何获取非类型模板参数的值?
template <int n>
class A { };
class B {
public:
int foo() {
return a.n; // error
}
private:
A<10> a;
};
我想在B
类比模板A
本身以外的实例化的类A<10>
的非类型模板参数的值,是有办法做到这一点?或者我应该使用其他一些设计来避免这个问题?
如果你不能得到合作(通过发布参数值)的类型,你可以自己一个traits类提取它:
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
。
您不能像这样访问其他类模板参数。其他类有揭露它,比如:
template <int n>
class A {
public:
static const int num = n;
};
然后你就可以访问它a.num
(或课程的A<10>::num
)
如果你有一个成员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;
};
@πάνταῥεῖ但'B'是一个普通的类,没有名为'n'的成员。 – Jaege
你声明'A <10> a',10是一个编译时常量。所以如果它是一个常量,为什么不在'foo'中硬编码数字10? – kamilk