使用可变参数实现sprintf

341 阅读1分钟

核心函数

//使用stringstream
void _GenStr(std::stringstream &ss,int idx){
}

template<typename T, typename... Args>
void _GenStr(std::stringstream &ss,int idx,T&& t,Args&&... args){
	if ( idx == 0 ){
		ss << t;
	}
	if ( sizeof...(args) > 0  && idx > 0 ){
		_GenStr(ss,idx-1,std::forward<Args>(args)...);
	}
}
//使用 string
void _GenStrStr(std::string &s,int idx){
}

template<typename T, typename... Args>
void _GenStrStr(std::string &s,int idx,T&& t,Args&&... args){
	if ( idx == 0 ){
		s.append(std::to_string(std::forward<T>(t)));
	}
	if ( sizeof...(args) > 0 && idx > 0  ){
		_GenStrStr(s,idx-1,std::forward<Args>(args)...);
	}
}

其中: 当使用自己定义数据类型时, 使用string时,需要重载std::to_string //效率快 使用stringstream时,需要重载 operator<< //较常见 相比之后,string 比 snprintf 要快, stringstream比 snprintf 要慢,但是对于自定义数据类型,重载<< 比较常由,所以提供两种方式。

img.png

源码见 github.com/kingbuffalo…