int的typedef等价物

时间:2012-10-30 18:15:47

标签: c++ templates typedef

如果我有一个模板容器,我可以使用typedef让我在编译时查找类型:

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();,但有时这可能很有用(例如,包含其他模板类的模板类)。

在我的例子中,模板没有指定typename,而是指定一个int(实际上是std::size_t):

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

我是否可以在类中声明一个typedef,它允许我在类之外获取值N?这是使用静态常量的合适位置吗?

1 个答案:

答案 0 :(得分:4)

现代编译器的常用方法是:

static const std::size_t value = N;

请注意,如果有人试图获取其地址,这将引发 undefined-behavior 。这通常意味着value的地址可能导致不同翻译单元的不同位置,但其未定义行为

通常在旧版编译器上使用的另一种方法是 undefined-behavior 打开,这是通过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

找到它的参考