Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

About the "template" part (i.e. including headers, defining macros) of the default template #68

Open
kmyk opened this issue Oct 24, 2020 · 0 comments

Comments

@kmyk
Copy link
Member

kmyk commented Oct 24, 2020

Description

現在のバージョン v4.7.1 の default の main.cpp はたいてい次を出力する。

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) ::std::begin(x), ::std::end(x)
using namespace std;

この #include 部分は platform.system()$CXX で制御されていて、環境によっては bits/stdc++.h は回避される。

if platform.system() == "Linux" and "clang" not in os.environ.get("CXX", "g++"):
include = "#include <bits/stdc++.h>"
else:
include = "\n".join([
"#include <iostream>",
"#include <string>",
"#include <vector>",
])

全員が満足するものは不可能なので「不満なら申し訳ないが自分でカスタマイズしてね」と言うしかないが、それでもできるだけ多くのユーザにとって使いやすいものにしておきたい。いまのところ現状の main.cpp は妥当であると (@kmyk は) 判断しているが、そうでなさそうなら代替案を提案してください。

Possible implementations and the analysis

#include について:

  • このまま
  • 常に #include <bits/stdc++h> を使う
    • これは環境によって壊れるからだめ
  • 常に #include <bits/stdc++h> を避ける (include は必要最小限に留める)
    • これは不便なだけだと思う
  • 常に #include <bits/stdc++h> を避ける (よく使う標準ヘッダをいくつか選んで include しておく)
    • 「よく使う」の定義が人によって変わるので「全員にとって不便でない」を目指すと「すべて include する」になるはず
  • 常に #include <bits/stdc++h> を避ける (すべての標準ヘッダを include しておく)
    • 長くなってつらい
    • C++17 で新規に追加された標準ヘッダなどをどうすればよいのか

#define されている REP macro などについて:

  • 使う (このまま)
    -「macro には MACRO_CASE を使う」という通常の作法と「できるだけ混乱のなさそうな名前を使う」を満たしてはいるはず
  • 使う (名前や定義を修正する)
    • 現状の名前がどれくらい標準的なのかの調査はしてない。より標準的かつ適切な名前があるなら乗り換えたい
    • repREP が両方 define されている」「FORREP が両方 define されている」などのとき、たいていどちらかは #define X(i, n) for (int i = 0; i < n; ++ i) でもう一方は #define Y(i, m, n) for (int i = m; i < n; ++ i) だと思うが、初見で自信を持って見分けられるものであってほしい
  • 消す
    • 不便

using namespace std; について:

  • 使う
    • 特にデメリットないので足しておきたい
    • left とか y0 みたいな名前のグローバル変数を定義できなかったりすると思うけど、そもそもグローバル変数は使うべきでない。不適切なことをすると不適切な結果になるのは当然であり、これは気にしなくてよい
  • 消す
    • 不便なだけだと思う

その他について:

  • このまま
  • なにか追加する
    • 例: typedef long long ll;
    • 例: template <class T, class U> using P = pair<T, U>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant