5

テンプレート コンテナーがある場合は、typedefコンパイル時に型を検索するために a を使用できます。

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 {
    // ...
};

クラス外で値 N を取得できるようにする、クラス内で宣言できる typedef に相当するものはありますか? これは静的定数を使用する適切な場所ですか?

4

1 に答える 1

4

最新のコンパイラでの通常のアプローチは次のとおりです。

static const std::size_t value = N;

誰かがそのアドレスを取得しようとすると、未定義の動作が発生することに注意してください。これは多くの場合、のアドレスがvalue異なる翻訳単位に対して異なる場所になる可能性があることを意味しますが、それでも未定義の動作です。

古いコンパイラで通常使用され、未定義の動作のドアを開いたままにしない別のアプローチは、次の方法によるエミュレーションenumsです。

enum { value = N };

Boost.ConfigBOOST_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 に答える