ジェネリックnum likeクラスを作成すると、関係するメンバー関数/演算子が存在することが重要になります。ジェネリックNumクラス
私はSFINAEを読んだことがありますが、正直ではありません。ここで
#include <iostream>
template<typename T>
class Numeric {
const T a;
public:
Numeric(const T &v) : a(v) {}
T operator+(const Numeric<T> &b) {
return a + b.a;
}
};
int main() {
Numeric<float> fl1(35.5);
Numeric<float> fl2(10.5);
Numeric<uint64_t> i64(10000);
std::cout << (i64 + fl1 + fl2) << std::endl;
return 0;
}
、
fl1 + fl2
は大丈夫だと思うが、オペレータの定義が言うので、
T
は
fl1
または
fl2
と混合することはできません同じタイプ
i64
です。 ここではテンプレートが正しいですか。たとえば、トップレベル
Num
を定義するオブジェクト階層を使用する方がよいでしょうか。すべての演算子を定義し、サポートされている各タイプのサブクラスを持っていますか?私はそれが混合タイプの問題を解決するとは思わないが。
EDIT 1:バリー/ lisyarusに解像度で 背景: 私はこのように定義された型を持つ古いコードベースを変更しています:
template<typename a> struct NumT : public SomeSuperType<a> { mp::cpp_int val;};
変更がネイティブのサポートを追加することですfloat
とdouble
のタイプはNumT
タイプで可能な限り透明な方法で入力してください。 理想的には、NumTは宣言の変更を超えて変更するべきではありません。 val
のタイプです。 既存のコードはa + b
と他の算術演算はval
にあるだけで、既存のAPIを破壊することは重要ではありません。 i64 + fl1 + fl2 == 10046
あなただけの 'T'によって解決されていない '数値'によって解決しようとしているだろうとは何ですか? –
Barry
あなたは正確に何を達成しようとしていますか?あるいは、 'i64 + fl1 + fl2'のタイプは何でしょうか? 'int64'でも' float'でも、それは損失です。 – lisyarus