Domanda

un parametro modello può essere utilizzato in un altro parametro modello che lo segue in questo modo:

template<typename T, T N>
struct s
{
};

Ma è possibile fare riferimento a "T" se è dichiarato dopo " N " ?

Questo non funziona:

template<T N, typename T>
struct s
{
};

Possiamo aiutare il compilatore pre-dichiarando " T " o fare qualcos'altro?

Grazie in anticipo.

MODIFICA: poiché le prime due risposte chiedevano "perché sei disposto a farlo?" Spiegherò l'obiettivo:

Vorrei far inferire al compilatore il tipo "T" al fine di facilitare l'uso delle classi basate su modelli.

Ad esempio:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};

Questo modello può essere utilizzato in questo modo:

sum<int, 1, 2>::value

Ma sarebbe meglio se potesse essere usato in questo modo:

sum<1, 2>::value

Tecnicamente dovrebbe essere possibile perché il compilatore conosce i tipi di " 1 " e "2" : " int " ;, e in effetti usa queste informazioni per trovare il miglior sovraccarico per una funzione. Quindi dichiarando il modello in questo modo:

template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};

il compilatore potrebbe usare la sua capacità per dedurre l'ultimo parametro dalle informazioni fornite dal primo e dal secondo, e quindi trovare il modello migliore da istanziare.

È stato utile?

Soluzione

Come altri dicono - No, questo non è possibile, il compilatore non può inferire il tipo di T dagli argomenti non di tipo template (nel caso di funzioni, trae i tipi dagli argomenti funzione ):

14.8.2.4/12 :

  

Un argomento del tipo di modello non può essere dedotto dal tipo di un argomento del modello non di tipo.

In ogni caso, non verrà fatta alcuna deduzione per gli argomenti di un modello di classe. Un esempio per un modello di funzione potrebbe essere

template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }

In questo caso, T non verrà dedotto come int - devi specificarlo esplicitamente.

Altri suggerimenti

Non puoi. Non vedo il motivo per cui lo stai facendo anche tu.

Di seguito c'è la spazzatura perché non ho letto correttamente la tua domanda.

In effetti, non vedo alcun punto in quello che stai cercando di raggiungere.

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}

Questo si compila per me con GCC e Comeau Online.

Penso che il problema sia con il tipo di T che stai cercando di usare. Gli argomenti del modello non di tipo supportano solo tipi integrali, quindi puntatori a oggetti con collegamento esterno (o qualcosa del genere e forse alcune altre cose molto limitate).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top