开幕雷击
(ferr("time use {} ms",clock() * 1000 / CLOCKS_PER_SEC)<<flush)("\nkind of new!");
一段奇怪的代码,考验各位的语法分析能力的时候到了,请问上文代码是如何实现的?
好吧,可能有不止一种方法实现就是了。ferr是一个 IO 类,我们先调用它的 operator() 进行 format 形式的输出,然后使用 operator<< 进行流形式的输出(flush刷新缓冲区),显然按照规范这个整体返回了 ferr 本身的引用,于是我们括号括起来(优先级的问题),再调用 operator() 输出。
拜托,很炫酷诶,能同时拥有 C语言风格 和 C++语言风格 的 IO 类真的很酷!那一晚,C和CPP都喝醉了......(话说按照辈分关系,她们岂不是在......)(考虑没有祖先关系,而是姐妹关系,那么快点把姐妹百合文端上来罢(喜))
至于实际有什么用处?想不出来()
不是什么有意义的文章,随便想到乱写的。
代码
class FastIO{
private:
const static int buffSize = 1<<23;
using charp = char*;
using ccp = const char*;
using FILEp = FILE*;
typedef ostream& (*ostreamFunc)(ostream&);
FILEp inFile,outFile;
char inputBuff[buffSize +2],outputBuff[buffSize + 2];
charp inputPtr = inputBuff,inputEnd = inputPtr;
charp outputPtr = outputBuff,outputEnd = outputBuff + buffSize;
inline bool IsSplited(char ch){
return (ch == ' ' || ch == '\n');
}
template <typename T>
void ReadInt(T &x){
x = 0;
char ch = FastGetChar();
int f = 1;
while(!isdigit(ch) && !fail){
if(ch == '-')f = -1;
ch = FastGetChar();
}
while(isdigit(ch) && !fail){
x = (x * 10) + (ch ^ 48);
ch = FastGetChar();
}
x *= f;
return ;
}
template <typename T>
void WriteInt(T x){
static int writeBuff[128];
if(x < 0){
FastPutChar('-');
x = -x;
}else if(x==0){
FastPutChar('0');
}
int tail = 0;
while(x){
writeBuff[++tail] = x % 10;
x /= 10;
}
while(tail){
FastPutChar(writeBuff[tail--] + '0');
}
return ;
}
inline void ReadString(string& str){
str = "";
char ch = FastGetChar();
while(!IsSplited(ch) && !fail){
str += ch;
ch = FastGetChar();
}
return ;
}
inline void WriteString(const string& str){
for(auto i : str){
FastPutChar(i);
}
return ;
}
inline void FmtOutput(ccp format){
for(;*format;format++){
FastPutChar(*format);
}
return ;
}
template<typename FirstType,typename... ResType>
inline void FmtOutput(ccp format,const FirstType& firstElement,const ResType&... res){
for(;*format;format++){
if(*format == '{' && *(format+1) == '}'){
operator<<(firstElement);
FmtOutput(format + 2,res...);
return ;
}
FastPutChar(*format);
}
return ;
}
public:
bool fail;
inline char FastGetChar(){
if(inputPtr == inputEnd){
size_t res = fread(inputBuff,1,buffSize,inFile);
inputEnd = inputBuff + res;//为什么其他地方不改inputEnd呢
if(res == 0){
fail = true;
inputPtr = inputBuff;
return EOF;
}
inputPtr = inputBuff;
}
return *(inputPtr++);
}
inline void FastPutChar(char ch){
if(outputPtr == outputEnd){
Flush();
}
*(outputPtr++) = ch;
return ;
}
inline void Flush(){
fwrite(outputBuff,1,outputPtr - outputBuff,outFile);
outputPtr = outputBuff;
return ;
}
inline void Endl(){
FastPutChar('\n');
return ;
}
FastIO& operator>>(short& integerVar){
ReadInt(integerVar);
return *this;
}
FastIO& operator>>(int& integerVar){
ReadInt(integerVar);
return *this;
}
FastIO& operator>>(long& integerVar){
ReadInt(integerVar);
return *this;
}
FastIO& operator>>(long long& integerVar){
ReadInt(integerVar);
return *this;
}
FastIO& operator>>(__int128& integerVar){
ReadInt(integerVar);
return *this;
}
//??支持浮点?
// FastIO& operator>>(float& floatVar){
// ReadFloat(floatVar);
// return *this;
// }
FastIO& operator>>(string& stringVar){
ReadString(stringVar);
return *this;
}
FastIO& operator>>(char& charVar){
charVar = FastGetChar();
while(IsSplited(charVar))charVar = FastGetChar();
return *this;
}
FastIO& operator<<(short integerVar){
WriteInt(integerVar);
return *this;
}
FastIO& operator<<(int integerVar){
WriteInt(integerVar);
return *this;
}
FastIO& operator<<(long integerVar){
WriteInt(integerVar);
return *this;
}
FastIO& operator<<(long long integerVar){
WriteInt(integerVar);
return *this;
}
FastIO& operator<<(__int128 integerVar){
WriteInt(integerVar);
return *this;
}
FastIO& operator<<(string stringVar){
WriteString(stringVar);
return *this;
}
FastIO& operator<<(char charVar){
FastPutChar(charVar);
return *this;
}
FastIO& operator<<(ostreamFunc func){
ostringstream oss;
oss<<func;
string str = oss.str();
for(auto i : str){
FastPutChar(i);
}
Flush();
return *this;
}
//format output,by using operator()
template<typename... ArgTypes>
FastIO& operator()(ccp format,const ArgTypes&... args){
FmtOutput(format,args...);
return *this;
}
operator bool(){
return not(fail);
}
FastIO(){
inFile = stdin,outFile = stdout;
return ;
}
FastIO(FILEp _inFile,FILEp _outFile){
inFile = _inFile,outFile = _outFile;
return ;
}
~FastIO(){
Flush();
return ;
}
}fio;
FastIO ferr(stdin,stderr);

Comments NOTHING