atcoder-tools icon indicating copy to clipboard operation
atcoder-tools copied to clipboard

C++ のコード生成結果には scanf と std::cin が混ざっているのをやめたい

Open kmyk opened this issue 7 years ago • 6 comments

統一される (文字列の場合があるので std::cin になる) と嬉しくて、選択可能になるともっとうれしいです。速度の問題で cin.tie(0) をしたりしなかったりとか、出力結果を加工してさらに何かするときの都合です。

実装の選択肢は以下のふたつになると思います。template は言語ごとに独立なので定義される値を足しても困ることはなく、実装や利用の単純さから後者がよいはずです。

  1. code generator を追加する
  2. {{input_part}} だけでなくて {{input_part_cin}} {{input_par_scanf}} を用意する

kmyk avatar Feb 16 '19 11:02 kmyk

確かに混ざってるのは良くないですね。既存のテンプレートの後方互換性は維持したいので、cppのコードジェネレーターに新しいテンプレートパラメータを追加する方向性が良さそうです。

kyuridenamida avatar Feb 16 '19 14:02 kyuridenamida

互換性の維持は重要ですが、今回の提案は (2.) でも互換性を破壊するようなものではないです。

{{input_part}} という変数を消すとまずいですが、そうでなくてその値を変えるだけだからです。 たしかに出力は文字列としては変化しますがその実際的な意味は変わりません。 (ただしもしこれが「すべて cin を使ってた場合に scanf に乗り換える」だと cin.tie(0) のまわりで互換性の検討が必要です)

kmyk avatar Feb 16 '19 16:02 kmyk

あ、かなり僕がよくわからないコメントを書いていたことが今わかりました。すみません忘れてください。

僕は提案2が好きで賛成です。 2つ目のコードジェネレーターをこさえるのは1はちょっとやりすぎな気がするので。

ドキュメントも最近テンプレート用のページを作ったので、言語ごとに使えるテンプレート変数一覧みたいなのをドキュメントに書けばユーザーとしてもわかりやすいはずです。

kyuridenamida avatar Feb 16 '19 17:02 kyuridenamida

この仕様が原因でREが発生することがあるので、早めに修正した方がいいと思います。 例)ARC087 D

blue-jam avatar Mar 03 '19 15:03 blue-jam

@blue-jam そのREの直接の原因はatcoder-tools側の仕様ではなくカスタムされたtemplate側の ios::sync_with_stdio(false); https://cpprefjp.github.io/reference/ios/ios_base/sync_with_stdio.html なので、その主張はあまり適切ではなさそうに読めます。 ただし「ios::sync_with_stdio(false); を意味を知らずにコピペする人は多いので統一してあげるとやさしい」という意図ならまったく同意します。

kmyk avatar Mar 04 '19 04:03 kmyk

「ios::sync_with_stdio(false); を意味を知らずにコピペする人は多い

私のことです

blue-jam avatar Mar 09 '19 06:03 blue-jam