Ich schreibe eine Vorlage-basierte Klasse für Polynome. (Evaluation, einige Operationen zwischen Polynomials, Differenzierung, ...), wie folgt aus: template <typename _ty> class Polynomial{...
C++ SFINAE Operator/Funktion Ergebnistyp überprüfen
Für die to_string
Funktion (und das std::ostream
-left-Shift-Override), musste ich überprüfen, ob _ty
die <
unterstützt -Operator (dh ja für reelle Zahlen, nein für komplexe Zahlen), damit die Zeichenkette schön formatiert werden kann. Dazu verwende ich diesen Code:
#include <type_traits>
template <class _op, class... _ty, typename = decltype(std::declval<_op>()(std::declval<_ty>()...))>
std::true_type impl_test(const _op&, const _ty&...) { return std::true_type(); }
std::false_type impl_test(...) { return std::false_type(); }
template <class> struct supports;
template <class _op, class... _ty> struct supports<_op(_ty...)> : decltype(impl_test(std::declval<_op>(), std::declval<_ty>()...)){};
#define is_ineq_supported(type) supports<std::less<>(type, type)>()
Kurz gesagt, is_ineq_supported(type)
gibt ein std::true_type
, wenn ein gültiges Überlastung für den <
-Operator ist, und ein false_type
, wenn nicht. Die entsprechenden Funktionen können dann mit einem true_type
oder false_type
als Unterscheidungs Argumente, so aufgerufen werden:
template <typename _ty> void do_stuff(_ty arg, const std::true_type&) {
// do stuff with the '<'-operator
}
template <typename _ty> void do_stuff(_ty arg, const std::false_type&) {
// do stuff without the '<'-operator
}
template <typename _ty> void do_stuff(_ty arg) {
do_stuff(arg, is_ineq_supported(_ty));
}
Ich habe auch eine Vector-Klasse, die den binären *
-Operator mit dem Skalarprodukt Überlastungen, so dass es wieder ein double
. Aber für ein Polynom macht es nur Sinn, Koeffizienten und Argumente zu haben, die denselben Typ zurückgeben, wenn sie miteinander multipliziert werden.
Mein Problem ist das folgende: Ich möchte eine Möglichkeit haben, zu überprüfen, ob die angegebene Operation einen bestimmten Typ zurückgibt. (Vielleicht ein ähnliches Makro?) Ich denke, das einfachste wäre etwas, das eine true_type
zurückgibt, wenn der Ergebnistyp dem Argumenttyp und eine anderenfalls entspricht. Natürlich sind allgemeinere Lösungen noch besser.
Falls IDE und Compiler wichtig sind: Ich verwende Visual Studio 2015 mit Standardeinstellungen.
„* (...) Wenn die angegebene Operation einen bestimmten Typ * "zurückgibt, wäre es vielleicht besser zu prüfen, ob der zurückgegebene Typ implizit in etwas umwandelbar ist? –
'std :: is_same' (oder' std :: is_convertible')? – Jarod42