2012-10-30 43 views
5

如果我有一個模板的容器,我可以用一個typedef讓我查找在編譯時類型:的typedef相當於爲INT

template <typename T> 
struct MyList { 
    typedef T Type; 
    T get_front() const; 
    // ... 
}; 

MyList<char> char_list; 
MyList<char>::Type front = char_list.get_front(); 

在這種情況下,你可以聲明char front = char_list.get_front();代替,但有時這可能是很有用(例如包含其他模板類的模板類)。

在我的情況下,模板不指定類型名稱,而是指定了一個int(實際上是一個std::size_t):

template <std::size_t N> 
struct MyClass { 
    // ... 
}; 

有一個typedef的等價,我可以在類中聲明能讓我在課外獲得N的價值嗎?這是一個適當的地方使用靜態常量?

回答

4

通常的做法在現代編譯器是:

static const std::size_t value = N; 

注意,如果有人試圖把它的地址,這將提高未定義行爲。這通常意味着value的地址可能會導致不同翻譯單元的位置不同,但其未定義行爲不過。

通常用在一些老的編譯器,並且不留下未定義行爲開門另一種方法,是通過仿真enums

enum { value = N }; 

Boost.Config提供BOOST_STATIC_CONSTANT宏這將基於編譯器的一致性來解決所描述的方法中的一種或另一種。它的用法是:

BOOST_STATIC_CONSTANT(std::size_t, value = N); 

它的參考可以在http://www.boost.org/doc/libs/1_51_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros

+0

大answer--發現,因爲這只是內部的內部代碼(不可訪問),我認爲靜態常量應該罰款。 – user

+1

@Oliver:只要確保你永遠不會執行'&value',如果你使用'value'作爲一個採用const引用參數的函數的參數,這可能會隱式發生。 –

+0

「現代編譯器」 - 它需要如何現代化? –

相關問題