這裏是例子:如何獲取非類型模板參數的值?
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