多項式のテンプレートベースのクラスを作成しています。 (評価、多項式の間にいくつかの操作、分化、...)このように、: to_string
機能(およびstd::ostream
-leftシフト・オーバーライド)の場合template <typename _ty> class Polynomial{...
C++ SFINAE演算子/関数の結果型チェック
、私は_ty
が<
をサポートしている場合、チェックしなければなりませんでした-operator(つまり、実数はyes、複素数はno)、文字列をうまくフォーマットすることができます。このために私はこのコードを使用します要するに
#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)>()
をされていない場合、is_ineq_supported(type)
は<
演算子はのための有効な過負荷がある場合std::true_type
を返し、false_type
。
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));
}
は、私はまた、内積とバイナリ*
演算子はオーバーロードをVectorクラスを、持っているので、それが返されます:対応する機能は、このように、特徴的な引数としてtrue_type
またはfalse_type
で呼び出すことができますdouble
。しかし、多項式の場合、互いに乗算されたときに同じ型を返す係数と引数を持つことは意味があります。
私の問題は次のとおりです。指定された操作が指定された型を返すかどうかを調べる方法があります。 (多分似たようなマクロですか?)私が思うに、最も単純なのは、結果の型が引数型と一致する場合はtrue_type
を返し、それ以外の場合はfalse_type
を返します。もちろん、より一般的な解決法はさらに優れています。
IDEとコンパイラの問題点:私はデフォルト設定でVisual Studio 2015を使用しています。
「*(... )指定された操作が指定された型を返すかどうか* "、返された型が何かに暗黙的に変換可能であるかどうかチェックするほうが良いでしょうか? –
'std :: is_same'(または' std :: is_convertible')? – Jarod42