2012-10-30 13 views
5

Wenn ich eine Vorlage Container haben, kann ich eine typedef verwenden, um mir die Art zum Zeitpunkt der Kompilierung Nachschlag zu lassen:typedef Äquivalent für int

template <typename T> 
struct MyList { 
    typedef T Type; 
    T get_front() const; 
    // ... 
}; 

MyList<char> char_list; 
MyList<char>::Type front = char_list.get_front(); 

In diesem Fall Sie char front = char_list.get_front(); stattdessen erklären könnte, aber manchmal kann das sein nützlich (z. B. Vorlagenklassen, die andere Vorlagenklassen enthalten).

In meinem Fall ist die Vorlage einen Typnamen nicht angeben, sondern gibt stattdessen einen int (eigentlich ein std::size_t):

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

Gibt es eine äquivalent einen typedef, die ich in der Klasse erklären kann, dass kann ich den Wert N außerhalb der Klasse bekommen? Ist dies ein geeigneter Ort, um eine statische Konstante zu verwenden?

Antwort

4

Der übliche Ansatz auf moderne Compiler ist:

static const std::size_t value = N; 

Beachten Sie, dass diese undefined-Verhalten erhöhen wird, wenn jemand seine Adresse zu nehmen versucht. Dies bedeutet oft, dass die Adresse value für unterschiedliche Übersetzungseinheiten unterschiedliche Positionen ergeben könnte, aber undefined-Verhalten trotzdem.

Ein weiterer Ansatz in der Regel auf älteren Compiler verwendet wird, und die die Tür von undefined-Verhalten offen nicht verlassen, ist Emulation über enums:

enum { value = N }; 

Boost.Config das BOOST_STATIC_CONSTANT Makro bietet denen Auflösen auf den einen oder anderen der beschriebenen Ansätze, basierend auf der Compilerkonformität. Seine Verwendung ist:

BOOST_STATIC_CONSTANT(std::size_t, value = N); 

Es Referenz ist kann bei 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

+0

Große answer-- gefunden werden, da dies nur innerhalb Inhouse-Code ist (nicht zugänglich) Ich denke, die static const sollte in Ordnung sein. – user

+1

@Oliver: Stellen Sie nur sicher, dass Sie '& value' niemals ausführen, was implizit passieren kann, wenn Sie' value' als Argument für eine Funktion verwenden, die einen konstanten Referenzparameter verwendet. –

+0

"moderne Compiler" - wie modern muss es sein? –