Ich bin spezialisiert std::common_type
für meinen Typen. Ich habe folgende Spezialisierung definiert:Klasse Template-Spezialisierung, die alle Versionen von konst/volatilen Qualifikationen akzeptiert und & vs &&
common_type<my_type, my_type>
Und alles ist gut. Dann kommt jemand vorbei und ruft std::common_type<my_type, my_type &>
an. Die Standardversion verhält sich genauso, wenn Sie eine Referenz im Gegensatz zu einer Referenz übergeben (wie sie std::decay
auf den Typen aufruft). Es wird jedoch nicht auf die Nicht-Referenzversion von std::common_type
verwiesen, die ich richtig arbeiten müsste. Gibt es einen besseren Weg, als so etwas zu tun zu haben (Weglassen rvalue Verweis der Einfachheit halber auf const):
common_type<my_type, my_type>
common_type<my_type, my_type &>
common_type<my_type, my_type const &>
common_type<my_type, my_type volatile &>
common_type<my_type, my_type const volatile &>
common_type<my_type, my_type &&>
common_type<my_type, my_type volatile &&>
common_type<my_type &, my_type>
common_type<my_type const &, my_type>
common_type<my_type volatile &, my_type>
common_type<my_type const volatile &, my_type>
common_type<my_type &&, my_type>
common_type<my_type volatile &&, my_type>
common_type<my_type &, my_type &>
common_type<my_type &, my_type const &>
common_type<my_type &, my_type volatile &>
...
Sicherlich gibt es einen besseren Weg? Nach meiner Schätzung ist, dass 49 mögliche Versionen, wenn wir const &&
und const volatile &&
Hinweis ignorieren: my_type ist eigentlich eine Klasse Vorlage selbst, so dass die Spezialisierung sieht tatsächlich eher wie
template<intmax_t lhs_min, intmax_t lhs_max, intmax_t rhs_min, intmax_t rhs_max>
class common_type<my_type<lhs_min, lhs_max>, my_type<rhs_min, rhs_max>>
Wo ist das Ergebnis my_type<min(lhs_min, rhs_min), max(lhs_max, rhs_max)>
wäre die Lösung recht einfach sein, wenn ich die volle Kontrolle über die primären Vorlagendefinitionen habe, aber ich kann natürlich nicht std::common_type
ändern.
Haben Sie einen Blick darauf geworfen, was die Standardbibliothek von 'std :: common_type' bedeutet? – Casey
Die Implementierung hat hier nicht viel Freiheit. Sie muss 'std :: decay' aufrufen (oder eine Implementierung, die davon nicht unterscheidbar ist). Und tatsächlich, das ist, was Gcc 4.8.2 tut –
Es ist irgendwie impliziert, aber nur um sicherzustellen: Sie können nicht anders als 'std :: common_type', d. H. Ändern Sie die" Call-Site "? Und Sie können SFINAE-geschützte Konvertierungsoperator-Templates nicht definieren, um '' my_type '" natürlich "zu machen? –
dyp