ho due operatori di modelli in classe:Quali sono le regole per la scelta tra un metodo di template variadic e un metodo di template usuale?
template<class T>
size_t operator()(const T& t) const {
static_assert(boost::is_pod<T>(), "Not a POD type");
return sizeof t;
}
template<typename... T>
size_t operator()(const boost::variant<T...>& t) const
{
return boost::apply_visitor(boost::bind(*this, _1), t);
}
mi passa boost::variant<some, pod, types, here>
come argomento di questi operatori. GCC 4.8 e llvm 6.0 compilano il codice fine, scegliendo l'operatore parametrizzato boost::variant
. gcc 4.7 sceglie l'operatore parametrizzato const T& t
e quindi non riesce a compilare a causa dell'asserzione statica.
Quindi, ho una domanda, quali sono le regole per la scelta tra queste due? Penso che gcc 4.7 debba avere un bug, ma non ho alcuna prova.
Non è * scegliere la migliore corrispondenza * come nel classificare le conversioni. È un ordinamento parziale che fa sovraccaricare quest'ultimo il preferito per un argomento boost :: variant. –
@PiotrS. Penso che la tua risposta sia in contrasto con la sezione citata. Inoltre, non sono sicuro che l'ordine di acquisto sia un problema con sovraccarichi dichiarati all'interno della stessa classe. (Questo trucco è spesso usato per le spedizioni ricorsive/variadiche che non funzionerebbero nello scope namespace) – sehe
cosa è contrario alla sezione quotata? dopo aver istanziato entrambi i modelli di funzione sono indistinguibili l'uno dall'altro, quindi PO viene considerato: "* F1 e F2 sono specializzazioni di modelli di funzione e il modello di funzione per F1 è più specializzato del modello per F2 in base alle regole di ordinamento parziale descritte in 14.5 .6.2. "* –