voglio specializzare un modello di classe con la seguente funzione:la specializzazione del modello con un tipo di templatized
template <typename T>
class Foo
{
public:
static int bar();
};
La funzione non ha argomenti e deve restituire un risultato in base al tipo di Foo. (In questo esempio giocattolo, torniamo il numero di byte del tipo, ma alla effettiva applicazione vogliamo tornare qualche oggetto meta-dati.) La specializzazione funziona per i tipi completamente specificati:
// specialization 1: works
template <>
int Foo<int>::bar() { return 4; }
// specialization 2: works
template <>
int Foo<double>::bar() { return 8; }
// specialization 3: works
typedef pair<int, int> IntPair;
template <>
int Foo<IntPair>::bar() { return 2 * Foo<int>::bar(); }
Tuttavia, Vorrei generalizzare questo ai tipi che dipendono da (altri) parametri del modello stessi. L'aggiunta dei seguenti specializzazione dà un errore di compilazione (VS2005):
// specialization 4: ERROR!
template <>
template <typename U, typename V>
int Foo<std::pair<U, V> >::bar() { return Foo<U>::bar() + Foo<V>::bar(); }
Io parto dal presupposto che non è legale C++, ma perché? E c'è un modo per implementare questo tipo di schema elegantemente?
Si noti, tuttavia, che non è necessario alcun specializzazioni per la restituzione delle dimensioni di T : 'static int Foo() {return sizeof (T); } '. Mi chiedo se questo tipo di schema potrebbe non essere d'aiuto con il tuo vero problema. – UncleBens