2010-04-23 12 views
6
typedef boost::interprocess::managed_shared_memory::segment_manager 
    segment_manager_t; // Works fine, segment_manager is a class 
typedef boost::interprocess::adaptive_pool 
    allocator_t; // Can't do this, adaptive_pool is a template 

Die Idee ist, dass, wenn ich zwischen boost interprocess mehrere verschiedene Optionen für Shared Memory und Allokatoren wechseln möchte, ich nur die Typdefs ändern. Leider sind die Allokatoren Vorlagen, daher kann ich den Zuordner, den ich verwenden möchte, nicht eingeben.Alias ​​für eine C++ Vorlage?

Gibt es eine Möglichkeit, einen Alias ​​für eine Vorlage in C++ zu erreichen? (Außer dem offensichtlichen #define ALLOCATOR_T boost::interprocess::adaptive_pool)

Antwort

17

Ja, (wenn ich verstehe Ihre Frage richtig) Sie können "wrap" die Vorlage in einer Struktur wie:

template<typename T> 
class SomeClass; 

template<typename T> 
struct MyTypeDef 
{ 
    typedef SomeClass<T> type; 
}; 

und verwenden Sie es als:

MyTypeDef<T>::type 

Edit: C++ Bei Ihrem Beispiel

: 0x wäre so etwas wie

template<typename T> 
using MyType = SomeClass<T>; 

EDIT2 unterstützen

typedef boost::interprocess::adaptive_pool allocator_t; 

kann

template<typename T> 
struct allocator_t 
{ 
    typedef boost::interprocess::adaptive_pool<T> type; 
} 

und als

allocator_t<SomeClass>::type 
+0

Danke! Die Umhüllungsmethode hat es geschafft. Ich konnte das C++ 0x-Beispiel nicht in gcc 4.4.1 mit -std = C++ 0x arbeiten. 'template typedef boost :: interprocess :: adaptive_pool allocator_t;' gibt 'Fehler: Template-Deklaration von 'typedef'' – porgarmingduod

1

C++ unterstützt dies nicht, obwohl es in dem neuen Standard festgelegt werden soll. Sie könnten eine neue Klassenvorlage von adaptive_pool ableiten, wenn es keine nicht-trivialen Konstruktoren gibt (oder wenn Sie gerne ein paar Weiterleitungskonstruktoren schreiben).

template <class T> 
class allocator_t : public adaptive_pool<T> { 
public: 
    // Just making up a forwarding constructor as an example. I know nothing 
    // anything about adaptive_pool. 
    allocator_t(int arg1, float arg2) : adaptive_pool<T>(arg1, arg2) { } 
}; 

EDIT: Vergessen Sie diese Antwort. Meine Stimme geht an @Akanksh.

+0

Vorlage von einer anderen Klasse ableiten eine Klasse verwendet, hat das Problem, dass es eine andere Art wird, so dass alle Funktionen, die die Basisklasse übernehmen würde nicht arbeiten. Wenn der Klassenname in eine Struktur eingeschlossen wird, bleibt der Typ gleich und verhält sich genau wie ein Typdef, d. H. Er ist genau derselbe Typ. – Akanksh

Verwandte Themen