文字列を変換するクラスがあります。
class transer{
transer * parent;
protected:
virtual string inner(const string & s) = 0;
public:
string trans(const string & s) {
if (parent)
return parent->trans(inner(s));
else
return inner(s);
}
transer(transer * p) : parent(p) {}
template <class T>
T create() { return T(this); }
template <class T, class A1> // no variadic templates for me
T create(A1 && a1) { return T(this, std::forward(a1)); }
};
だから私はサブクラスを作成することができます
class add_count : public transer{
int count;
add_count& operator=(const add_count &);
protected:
virtual string inner(const string & s) {
return std::to_string((long long)count++) + s;
}
public:
add_count(transer * p = 0) : transer(p), count(0) {}
};
そして、変換を使用できます。
void use_transformation(transer & t){
t.trans("string1");
t.trans("string2");
}
void use_transformation(transer && t){
use_trasnformation(t);
}
use_transformation(add_count().create<add_count>());
このためのより良いデザインはありますか?可能であれば動的allocation/shared_ptrの使用を避けたいのですが、通話中に一時的なものが存続するかどうかはわかりません。また、破壊中にそれぞれが親と会話できるようにしたいtranser
ので、一時的なものも正しい順序で破壊する必要があります。連鎖変換を作成して後で使用するために保存することも困難です。
sometrans t = add_count().create<trans1>().create<trans2>().create<trans3>();
もはや存在しない一時的なものへのポインタを保存します。のようなことをする
trans1 t1;
trans2 t2(&t1);
trans3 t3(&t2);
安全ですが、迷惑です。このような連鎖操作を行うためのより良い方法はありますか?