2016-03-05 30 views
0

這裏是例子:如何獲取非類型模板參數的值?

template <int n> 
class A { }; 

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

我想在B類比模板A本身以外的實例化的類A<10>的非類型模板參數的值,是有辦法做到這一點?或者我應該使用其他一些設計來避免這個問題?

+0

@πάνταῥεῖ但'B'是一個普通的類,沒有名爲'n'的成員。 – Jaege

+0

你聲明'A <10> a',10是一個編譯時常量。所以如果它是一個常量,爲什麼不在'foo'中硬編碼數字10? – kamilk

回答

1

如果你不能得到合作(通過發佈參數值)的類型,你可以自己一個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

3

您不能像這樣訪問其他類模板參數。其他類有揭露它,比如:

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

然後你就可以訪問它a.num(或課程的A<10>::num

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

我可以使用'decltype'或類似編譯時類型標識來解決這個問題嗎? – Jaege

+0

@Jaege你想解決什麼確切的問題? Decltype不能訪問模板參數。當從模板創建類時,A 只是類名。如果您需要在運行時訪問模板參數,則需要使用常量。 –

+0

我在* C++ Primer *中做了16.14的練習,其中定義了一個類模板'Screen'和一個'Window_mgr'類。在'Window_mgr :: clear()'裏面,我需要清理屏幕上的內容。完整的代碼是[here](https://ideone.com/6N8z7w)。 – Jaege