use*_*ser 5 c++ templates typedef
如果我有一个模板容器,我可以用a 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();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以char front = char_list.get_front();
改为声明,但有时这可能很有用(例如,包含其他模板类的模板类).
在我的例子中,模板没有指定typename,而是指定一个int(实际上是a std::size_t
):
template <std::size_t N>
struct MyClass {
// ...
};
Run Code Online (Sandbox Code Playgroud)
是否有类似于我可以在类中声明的typedef,这将允许我在类之外获取值N?这是使用静态常量的合适位置吗?
现代编译器的常用方法是:
static const std::size_t value = N;
Run Code Online (Sandbox Code Playgroud)
请注意,如果有人尝试获取其地址,这将引发未定义行为。这通常意味着 的地址value
可能会导致不同翻译单元的不同位置,但其未定义行为仍然如此。
通常在较旧的编译器上使用的另一种方法是通过以下方式进行模拟,该方法不会打开未定义行为enums
的大门:
enum { value = N };
Run Code Online (Sandbox Code Playgroud)
Boost.Config提供了BOOST_STATIC_CONSTANT
宏,该宏将根据编译器一致性解析为所描述的一种或另一种方法。它的用法是:
BOOST_STATIC_CONSTANT( std::size_t, value = N );
Run Code Online (Sandbox Code Playgroud)
它的参考可以在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找到