I want to make in/out functions not to write format specifiers many times. (I don't want to use cin/cout functions as possible, because they run slowly.)
So, I write this code.
If there are "int_fast16_t i" and "string s," I expect: {scanf(%d, i); cin >> s;} == {in() >> i >> s;}
struct in
{
template<typename typ> in& operator>>(typ& val) { std::cin >> val; return *this; }
in& operator>>(char& val) { std::scanf(" %c", &val); return *this; }
in& operator>>(std::int_fast8_t& val) { std::scanf("%" SCNdFAST8, &val); return *this; }
in& operator>>(std::uint_fast8_t& val) { std::scanf("%" SCNuFAST8, &val); return *this; }
in& operator>>(std::int_fast16_t& val) { std::scanf("%" SCNdFAST16, &val); return *this; }
in& operator>>(std::uint_fast16_t& val) { std::scanf("%" SCNuFAST16, &val); return *this; }
in& operator>>(std::int_fast32_t& val) { std::scanf("%" SCNdFAST32, &val); return *this; }
in& operator>>(std::uint_fast32_t& val) { std::scanf("%" SCNuFAST32, &val); return *this; }
in& operator>>(std::int_fast64_t& val) { std::scanf("%" SCNdFAST64, &val); return *this; }
in& operator>>(std::uint_fast64_t& val) { std::scanf("%" SCNuFAST64, &val); return *this; }
in& operator>>(float& val) { std::scanf("%f", &val); return *this; }
in& operator>>(double& val) { std::scanf("%lf", &val); return *this; }
};
struct out
{
template<typename typ> template<> out& operator<<(typ& val) { std::cout << val; return *this; }
out& operator<<(char& val) { std::printf("%c", val); return *this; }
out& operator<<(std::int_fast8_t& val) { std::printf("%" PRIdFAST8, val); return *this; }
out& operator<<(std::uint_fast8_t& val) { std::printf("%" PRIuFAST8, val); return *this; }
out& operator<<(std::int_fast16_t& val) { std::printf("%" PRIdFAST16, val); return *this; }
out& operator<<(std::uint_fast16_t& val) { std::printf("%" PRIuFAST16, val); return *this; }
out& operator<<(std::int_fast32_t& val) { std::printf("%" PRIdFAST32, val); return *this; }
out& operator<<(std::uint_fast32_t& val) { std::printf("%" PRIuFAST32, val); return *this; }
out& operator<<(std::int_fast64_t& val) { std::printf("%" PRIdFAST64, val); return *this; }
out& operator<<(std::uint_fast64_t& val) { std::printf("%" PRIuFAST64, val); return *this; }
out& operator<<(float& val) { std::printf("%f", val); return *this; }
out& operator<<(double& val) { std::printf("%lf", val); return *this; }
};
However, it causes errors.
error: 'in& in::operator>>(int_fast32_t&)' cannot be overloaded with 'in& in::operator>>(int_fast16_t&)'
note: previous declaration 'in& in::operator>>(int_fast16_t&)'
error: 'in& in::operator>>(uint_fast32_t&)' cannot be overloaded with 'in& in::operator>>(uint_fast16_t&)'
note: previous declaration 'in& in::operator>>(uint_fast16_t&)'
error: 'in& in::operator>>(int_fast64_t&)' cannot be overloaded with 'in& in::operator>>(int_fast16_t&)'
note: previous declaration 'in& in::operator>>(int_fast16_t&)'
error: 'in& in::operator>>(uint_fast64_t&)' cannot be overloaded with 'in& in::operator>>(uint_fast16_t&)'
note: previous declaration 'in& in::operator>>(uint_fast16_t&)' ...(other similar error)
Are int_fast16_t, int_fast32_t and int_fast64_t the same? If so, what should I rewrite to make correct functions?