2 Stimmen

Parameter für Spezialisierung und Vorlagenvorlagen

Ich habe die folgenden:

template <template <typename, typename> class C, class T, class A >
class TTCTest
{
public:
        TTCTest(C<T, A> parameter) { /* ... some stuff... */ }
        C<T, A> _collection;
};

Ich möchte sicherstellen, dass die Vorlage nur instanziiert wird, wenn die Klassen T und A von einem bestimmten Typ sind (Pfad bzw. Zuweiser).

Zum Beispiel:

...
list<path, allocator<path> > list1;
list<int, allocator<int> > list2;

TTCTest<list> testvar(list1); // ...should work
TTCTest<list> testvar(list2); // ...should not work
...

Ist dies möglich und wie lautet die Syntax?

Grußworte, Oberst

2voto

Bart van Ingen Schenau Punkte 15048

Das kann man mit einer partiellen Spezialisierung erreichen, bei der man keine Implementierung für den nicht spezialisierten Fall bereitstellt.
Zum Beispiel:

template <template <typename, typename> class C, class T, class A >
class TTCTest;

template <template <typename, typename> class C>
class TTCTest<C, path, allocator<path> >
{
  // ...
};

1voto

Gene Bushuyev Punkte 5424

Sie können Trait-Klassen erstellen, um Instanziierungen einzuschränken. Beschränken Sie zum Beispiel Ihre TTCTest-Konstruktion nur auf path Typ:

template<class T, class A> class path {};
template<class T, class A> class not_path {};

template<class T> class allocation {};

template<class T>
struct Testable;

template<class T, class A>
struct Testable<path<T,A> > {};

template <template <typename, typename> class C, 
class T, class A >
class TTCTest
{
public:
        TTCTest(C<T, A> parameter, Testable<C<T,A> > = Testable<C<T,A> >());
        C<T, A> _collection;
};

void foo()
{
   path<int, allocation<int> > p;
   TTCTest<path, int, allocation<int> > t(p); // compiles

   not_path<int, allocation<int> > np;
   TTCTest<not_path, int, allocation<int> > t1(np); // fails
}

Bearbeiten: Da Sie später angedeutet haben, dass Sie vielleicht nur eine partielle Spezialisierung benötigen, würde es in diesem Fall so aussehen:

template <class T, class A >
class TTCTest<path, T, A>
{
public:
        TTCTest(path<T, A> parameter);
        path<T, A> _collection;
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X