L'idea è che ho una funzione che fa qualcosa l'aritmetica con l'ingresso, quindi forse qualcosa di simile:Come rendere is_arithmetic <myClass> :: valore vero?
#include <type_traits>
#include <vector>
using namespace std;
template<typename T>
double mean(const vector<T>& vec)
{
static_assert(is_arithmetic<T>::value, "Arithmetic not possible on this type");
//compute mean (average)
}//mean
Questa grande opera, e calcola la media per tutti i tipi di numero che ho messo in Ma lascia. dico allora creo una nuova classe:
class foo
{
// class that has arithmetic operations created
};// foo
e nella definizione di questa classe, ho definito gli operatori necessari, + e /, in modo da lavorare con ingressi attesi. Ora voglio usare la mia funzione media con la mia nuova classe, ma ovviamente non verrà compilata a causa di static_assert. Quindi, come faccio a dire al compilatore che la mia nuova classe dovrebbe soddisfare is_arithmetic<foo>::value
?
Sarebbe bello se quando creo la classe potrei dargli un tipo che soddisfi is_arithmetic, ma questo sembra che potrebbe causare un problema con type_traits in qualche modo?
O avrei bisogno di creare un nuovo test, che verifica
is_arithmetic<T>::value || type(T,foo)
o qualcosa del genere?
Preferirei solo adattare la mia classe, piuttosto che la funzione se possibile, ma sono curioso di trovare una soluzione.
È necessario scrivere il proprio tratto. –
@ T.C. Ok, ho pensato tanto. È così semplice creare una nuova 'struct' come' is_like_number' e tramite specifiche del template che lo dichiarano vero per 'foo'? Non importa, tu rispondi sotto. Grazie – user2386276