2012-10-30 40 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

“现代编译器” - 它需要如何现代化? –

相关问题