如果我有一个模板容器,我可以使用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?这是使用静态常量的合适位置吗?
答案 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 );
找到它的参考