Articles of typetraits

Disambigui il puntatore della funzione membro sovraccarico passato come parametro del template

Sto tentando di ricreare il pattern Observer in cui posso inoltrare perfettamente i parametri a una funzione membro degli osservatori. Se provo a passare l’indirizzo di una funzione membro che ha più sostituzioni , non è ansible dedurre la funzione membro corretta in base agli argomenti. #include #include #include template struct observer_list { template void […]

Cosa fanno i compilatori con la ramificazione in fase di compilazione?

EDIT: Ho preso il caso “if / else” come un esempio che a volte può essere risolto in fase di compilazione (ad esempio quando sono coinvolti i valori statici, cf ). Adattare le risposte di seguito ad altri tipi di ramificazioni statiche (ad es. Rami multipli o rami a criteri multipli) dovrebbe essere semplice. Nota […]

Cosa è decltype con due argomenti?

Modifica, per evitare confusione: decltype non accetta due argomenti. Vedi le risposte. Le seguenti due strutture possono essere utilizzate per verificare l’esistenza di una funzione membro su un tipo T durante la compilazione: // Non-templated helper struct: struct _test_has_foo { template static auto test(T* p) -> decltype(p->foo(), std::true_type()); template static auto test(…) -> std::false_type; }; […]

controlla i parametri dei modelli variadici per l’unicità

Voglio che i parametri del modello variadico debbano essere univoci. So che quando l’eredità multipla, l’ereditarietà delle classi identiche non è consentita. struct A{}; struct B: A, A{}; // error Usando questa regola, ho creato un piccolo codice. #include template struct id{}; template struct base_all : id … {}; template struct is_unique { template static […]

Perché non esiste un tratto di tipo std :: is_struct?

L’ho visto per verificare se un tipo T è una class che posso usare: bool isClass = std::is_class::value; Restituisce vero per entrambe le classi e le strutture. So che in C ++ sono quasi la stessa cosa, ma mi piacerebbe sapere perché non c’è una distinzione tra loro nel tipo di tratto. È sempre inutile […]

Controlla i tratti per tutti gli argomenti del modello variadic

Background: Ho creato la seguente class C , il cui costruttore dovrebbe prendere N variabili di tipo B& : class A; class B { A* getA(); }; template class C { public: template inline C(Args&… args) : member{args.getA()…} {} private: std::array member; }; Problema: il mio problema è come limitare gli Arg variadici a essere […]