5

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

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 (实际上是 a std::size_t):

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

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

4

1 回答 1

4

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

static const std::size_t value = N;

请注意,如果有人试图获取其地址,这将引发undefined-behavior 。这通常意味着 的地址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

于 2012-10-30T18:17:58.723 回答