【问题标题】:typedef equivalent for int等效于 int 的 typedef
【发布时间】:2012-10-20 03:51:21
【问题描述】:

如果我有一个模板容器,我可以使用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();,但有时这可能很有用(例如,包含其他模板类的模板类)。

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

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

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

【问题讨论】:

    标签: c++ templates typedef


    【解决方案1】:

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

    static const std::size_t value = N;
    

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

    另一种通常在较旧的编译器上使用且不会打开 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找到

    【讨论】:

    • 很好的答案——因为这只是内部代码(不可访问)我认为静态常量应该没问题。
    • @Oliver:只要确保你从不使用&amp;value,如果你使用value 作为一个带有常量引用参数的函数的参数,这可能会隐式发生。
    • “现代编译器”——它需要有多现代?
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多