2016-11-19 2 views
1

Ich habe eine Vorlage:Wie kann man eine Vorlage neu spezialisieren?

template<class T> 

und ich erwarte, dass T ein spezialisierter Container sein, beispielsweise std::array<int, 5>.

Und mit diesem std::array<int, 5> möchte ich irgendwie einen Typ herstellen, der wie folgt aussehen würde: std::array<std::pair<bool, int>, 5>.

Ist es möglich?

Ich nehme an, wenn ich irgendwie ein reines, unspezialisiert std::array aus std::array<int, 5> extrahieren können, und die Parameter dieses std::array als Parameter Pack spezialisiert, ich es so tun könnte:

template<typename Container, typename T, typename ...Rest> 
using rc = Container<std::pair<bool, T>, Rest...>; 

using respecialized_container = 
    rc<unspecialized_container, container_parameters>; 

Aber, dies zu tun , Ich brauche dies unspecialized_container und container_parameteres ...

Gibt es eine Möglichkeit, die ich tun kann?

+2

Es ist einfach zu tun, nur für 'Array', aber im Allgemeinen schwieriger, weil Ihre Client-Vorlagen sowohl Typ als auch Nicht-Typ-Parameter haben können, und das ist schwer zu verallgemeinern. Außerdem müssten Sie den Zuordnungsparameter für die dynamischen Container neu binden. –

+3

Wir bearbeiten den Tag [tag: C++] nicht in Ihren Fragen, weil es Spaß macht; Wir machen es, weil wir möchten, dass _you_ Ihre Fragen richtig markiert. Nehme einen Hinweis! –

+1

@LightnessRacesinOrbit Okay, werde ich. Aus reiner Neugierde, erinnerst du dich an mich unter dieser riesigen Menge von SO - Benutzern, oder hast du eine Liste potentiell problematischer Benutzer, die nur für Veteranen mit hohem Ansehen sichtbar sind, und ich zufällig auf diese Liste gesetzt wurde, weil ich notorisch vergessen habe, sie hinzuzufügen C++ Markierung? – gaazkam

Antwort

4

Hier ist ein Teil-Ansatz, der für beide std::array und die einfachen Standardbibliothek Container (diejenigen, die nehmen genau zwei Parameter) funktioniert:

#include <array> 
#include <memory> 
#include <utility> 

template <typename> struct boolpair_rebind; 

template <typename C> using boolpair_rebind_t = typename boolpair_rebind<C>::type; 

template <typename T, std::size_t N> 
struct boolpair_rebind<std::array<T, N>> 
{ 
    using type = std::array<std::pair<bool, T>, N>: 
}; 

template <typename T, typename Alloc, template <typename, typename> class DynCont> 
struct boolpair_rebind<DynCont<T, Alloc>> 
{ 
    using NewT = std::pair<bool, T>; 
    using type = DynCont< 
        NewT, 
        typename std::allocator_traits<Alloc>::rebind_alloc<NewT>>; 
}; 

Jetzt gegeben, sagen wir, T = std::array<int, 5>, erhalten Sie

boolpair_rebind_t<T> = std::array<std::pair<bool, int>, 5>; 

und U = std::list<float> gegeben, erhalten Sie

boolpair_rebind_t<U> = std::list<std::pair<bool, int>>; 

Sie können dies von Fall zu Fall auf andere Klassen von Containern erweitern, indem Sie Teilspezialisierungen von boolpair_rebind hinzufügen.

Verwandte Themen