タイプに対して有効な場合に文字列を受け入れる文字列ラッパーをいくつか作成したかったのです。
Length
有効な文字列:mm、m、ft、inAngle
有効な文字列:deg、rad
私は次のような使用法を想像しました:
Length len = read_from_keyboard(); // or some means of initialization
if( len.is_valid() ) { ... }
だから私はこれらの実装を書きました。
struct Length
{
QString m;
Length() {}
Length( QString s ) { if( is_valid_string(s) ) { m = s; } }
QString operator() () { return m; }
bool is_valid() { return is_valid_string(m); }
static bool is_valid_string( QString s ) {
return s == "mm" || s=="m" || s=="ft" || s=="in";
}
};
と
struct Angle{
QString m;
Angle() {}
Angle( QString s ) { if( is_valid_string(s) ) { m = s; } }
QString operator() () { return m; }
bool is_valid() { return is_valid_string(m); }
static bool is_valid_string( QString s ) {
return s == "deg" || s=="rad";
}
};
is_valid_string()
これは、実装における唯一の違いとして、ある種の静的ポリモーフィズムのように思えます。
私はこれらのクラスをいくつか持っているので、共通の機能を把握するために(仮想経由ではなく)静的継承を使用することを考えました。
だから、私は不思議なことに繰り返されるテンプレートパターンを使用することを考えました:
template <class T>
struct ConstrainedText {
QString m;
ConstrainedText() {}
ConstrainedText( QString s ) { if( T::is_valid_string(s) ) { m = s; } }
QString operator() () { return m; }
bool is_valid() { return T::is_valid_string(m); }
};
struct Angle : public ConstrainedText<Angle> {
static bool is_valid_string( QString s ) {
return s == "deg" || s="rad";
}
};
struct Length : public ConstrainedText<Angle> {
static bool is_valid_string( QString s ) {
return s == "mm" || s="m" || s=="ft" || s=="in";
}
};
しかし今、私は基本クラス内の暗黙のコンストラクターを失い、それらを書き直さなければなりません!
default constructor
同じインターフェース[ 、、implicit constructor
およびis_value()
]を持ち、異なる部分(静的)に対して最小限のコードのみを記述するためにこれを実装できる他の方法はありますis_valid_string()
か?
プリプロセッサを使用できたはずですが、コードをデバッガに適したものにしたいと考えています。