15
4

2 に答える 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 に答える