30615 次
2 に答える
4
オブジェクトをベース ポインターで出力する場合は、基本クラスで ostream 演算子を作成します。
class DbValueBase {
protected:
virtual ~DbValueBase() {}
virtual void print(std::ostream&) const = 0;
friend std::ostream& operator << (std::ostream& os, const DbValueBase & obj)
{
obj.print(os); return os;
}
};
template <typename T>
class DbValue : public DbValueBase {
public:
void print(std::ostream& os) const
{
out << dataref();
}
};
于 2012-11-12T16:53:58.430 に答える
3
デバッガー*(i->second)
はタイプが であると正しく識別しますがDbValue<std::string>
、その判断は実行時にのみ利用可能な情報を使用して行われます。
コンパイラは、それが a で動作していることだけを知っており、それDbValueBase&
に基づいてコードを生成する必要があります。したがって、またはサブクラスoperator<<(std::ostream&, const DbValue<T>&)
を受け入れない as は使用できません。DbValueBase
DbValue<>
を介してオブジェクトのコンテンツを取得するためDbValueBase&
に、Visitor デザイン パターンにループすることができます。
いくつかのコード例:
class Visitor {
public:
template <typename T>
void useValue(const T& value);
};
class DbValueBase {
public:
virtual void visit(Visitor&) = 0;
};
template <class T>
class DbValue : public DbValueBase {
pblic:
void visit(Visitor& v) {
v.useValue(m_val);
}
private:
T m_val;
};
于 2012-11-13T16:04:03.813 に答える