2015-10-22 17 views

risposta

10

Aggiungendo alla risposta di @Kerrek SB, qui è l'approccio generico:

template<typename...> struct rebinder; 

template<template<typename...> class Container, typename ... Args> 
struct rebinder<Container<Args...>>{ 
    template<typename ... UArgs> 
    using rebind = Container<UArgs...>; 
}; 

che funziona per qualsiasi contenitore sotto il sole.

+0

Perché non funziona per std :: array? –

+1

@ Benoît perché ha parametri del modello di valore, questa classe dovrebbe essere modificata per quel caso. – CoffeeandCode

+0

Hum, non ho mai pensato al fatto che typename ... si espandesse solo sui tipi, il che è ovvio. Grazie. –

7

Sì, si può fare un semplice modello rebinder con specializzazione parziale:

#include <memory> 
#include <vector> 

template <typename> struct vector_rebinder; 

template <typename T, typename A> 
struct vector_rebinder<std::vector<T, A>> 
{ 
    template <typename U> 
    using rebind = 
     std::vector<U, 
        typename std::allocator_traits<A>::template rebind_alloc<U>>; 
}; 

Usage:

using T1 = std::vector<int>; 

using T2 = vector_rebinder<T1>::rebind<double>; 

Ora T2 è std::vector<double>.

+0

Ahimè, questo funziona solo per il vettore, l'idea è di averlo per classi template, list, map, mylist, ecc ... senza il rebinder per ognuno di essi. – g24l

+0

Una cosa mi disturba, cambierai il tipo di vettore ma non il tipo di allocatore. All'inizio il vettore contiene il valore di tipo 'int' e un allocatore di tipo' std :: allocator '. Qui si modifica il tipo di valore in double ma non il tipo di allocatore. che portano a: Tipo di valore: doppio Tipo di allocatore: std :: allocatore L'esempio http://coliru.stacked-crooked.com/a/2c8d57b2736947ee mostra l'errore. Abbiamo uno std :: vector > – Pumkko

+0

@Pumkko: Ah sì, è davvero un'idea banale. Lascia che lo cambi. –

Problemi correlati