`std :: ostream`演算子をオーバーロードするときにデフォルトの非タイプテンプレートパラメータを変更する方法はありますか?

SHP
#include <iostream>

struct Foo {
  template <int bias = 5>
  void print() {
    std::cout << bias << std::endl;
  }
};

template <int bias = 5>
std::ostream &operator<<(std::ostream &os, const Foo &foo) {
  return os << bias;
}

int main() {
  Foo a;
  a.print();
  a.print<>();
  a.print<1>();
  std::cout << a << std::endl;
  return 0;
}

このコードを表示することで、ひどい実装にもかかわらず、フォーマット使用してデフォルトのパラメーター5 を出力Foo astd::cout << a << std::endlに変更し、変更を変更しない方法はありますstructか?

ヴェルナーヘンゼ

operator <<演算子のように呼び出す場合、テンプレートパラメータを追加することはできません

std:cout << a << std::endl;

ただしoperator <<、関数のように呼び出す場合は、テンプレートパラメータを追加できます。戻り値の型は演算子スタイルの構文でstd::ostream &さらに呼び出すことができることに注意してくださいoperator <<

operator<< <3>(std::cout, a) << std::endl;

operator <<出力の前にさらに呼び出しを追加することも可能ですがa、それはすべて元の呼び出しほど見栄えがよくありません。

operator<< <3>(std::cout << "a=", a) << std::endl;

operator <<ヘルパークラスを導入することにより、元の作品の連鎖と連携する別のオプション

template<int Bias>
struct Biased {
    Biased(Foo& foo) :_foo{ foo } {}
    Foo& _foo;
};

template<int Bias>
std::ostream& operator<<(std::ostream& os, const Biased<Bias>& biased) {
    return os << Bias;
}

std::cout << "a=" << Biased<42>(a) << std::endl;

for必要に応じてのコンテンツも出力できるように追加_fooしたことに注意してください(これはここのコードでは発生しません)。Biasedoperator <<Biased_foo

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ