m3908714035 さんが書きました: ↑5年前
本題とは少しずれるのですが、cinはiostreamをインクルードしてstd::cin>>s;のように使えますが、
今回提示いただいたコードだと一度IN inと宣言が入ってからin>>s;となっていると思います。
何かコードに工夫をし、IN inの宣言なしにin>>s;と書くことはできるのでしょうか。
IN in; の宣言をなくすのなら、in >> s; を IN() >> s; と書けば
よいのではありませんか?
宣言でオブジェクトを確保するのではなく、コンストラクタの
呼び出しによる一時オブジェクトを使えばよい、ということです。
クラス名を in にし、マクロ名を IN にすると、
コード:
#include <iostream>
#include <string>
using uint = unsigned int;
using ulong = unsigned long;
using ushort = unsigned short;
#define IN(T, F) in& operator>>(T& v) { scanf(F, &v); return *this; }
struct in {
template<typename T> in& operator>>(T& v) { std::cin >> v; return *this; }
IN(char, " %c") IN(int, "%d") IN(uint, "%u")
IN(short, "%hd") IN(ushort, "%hu") IN(long, "%ld") IN(ulong, "%lu")
IN(float, "%f") IN(double, "%lf")
};
int main()
{
char c; int i; uint u; short h; ushort H; long l; ulong L;
float f; double d; std::string s;
in() >> c >> i >> u >> h >> H >> l >> L >> f >> d >> s;
std::cout << c << "\n" << i << "\n" << u << "\n" << h << "\n" << H << "\n"
<< l << "\n" << L << "\n" << f << "\n" << d << "\n" << s << "\n";
}
ところで、本当に scanf は速いんでしょうか?
実行時に書式を解釈しないといけないので遅くなるような気がします。
まあ、実装に依存するんでしょうね。
fgetc や fgets は cin >> c や getline(cin, s) より速そうですが、
getline は、string s なので、サイズの制限がありませんよね。
動的にメモリを確保するから遅いのではありませんか?
また、このやり方だと EOF やエラーの検出はどうするのでしょうか?