1

オブジェクトをコマンド ライン (または他の出力ストリーム) に書き込むために、<<演算子をオーバーロードすることができます。しかし、テンプレートでこれを達成する可能性はありますか? 次のものがあるとします。

template <typename identifier>
class SomeTemplate {
public:
  SomeTemplate();
  ~SomeTemplate();
  void addElement(identifier id, unsigned int elem);
  unsigend int getElement(identifier id);
private:
  std::map<identifier, unsigned int> data_map_;
};

たとえば、タイプの識別子でクラスを特殊化すると、std::tuple<unsigned int, unsigned int, unsigned int>関数getElement(identifier id)は一貫性チェックを実行しstd::cout、要求された要素が に存在しない場合に警告を書き込む必要がありdata_map_ます。id を単に cout に渡すだけでは機能しません。これは<<、特殊化に使用される型のオーバーロードされた演算子がない可能性があるためです。これを達成する他の可能性はありますか?おそらく、すべての識別子が<<演算子をオーバーロードするように強制する純粋な仮想クラスを識別子が実装する必要がある可能性があります。しかし、これは可能ですか?

ご協力いただきありがとうございます。

よろしく

4

2 に答える 2

3

通常行うべきことは、ストリーム出力演算子を持つことがその型の前提条件であることを簡単に述べることですidentifier。これは、印刷するための純粋な仮想メソッドを持つ基本クラスよりも、テンプレートを使用したジェネリック C++ プログラミングの精神に確かに近いものです。

必要に応じて、特定のタイプのストリーム出力演算子がない場合は、おそらく SFINAE を使用して単純な「使用不可」メッセージを出力できます。

于 2013-03-02T12:14:27.960 に答える
1

あなたの最初の質問は、「テンプレートに対して [overload operator<<] を使用する可能性はありますか?」もちろん...

template <typename identifier>
std::ostream& operator<<(std::ostream& out, SomeTemplate<identifier> const& rhs);

その宣言の定義は問題なく機能します。

しかし、あなたが本当に求めているのは、ストリーミングできますstd::tupleか? 答えはノーのようです。もちろん、ローカルoperator<<を作成することもできますが、あまり広く公開しないでください。

于 2013-03-02T12:16:04.773 に答える