Вам не нужно использовать рекурсию для этой работы.
Вы можете создать поддельный массив с расширяющимся пакетом параметров при его заполнении:
template<class ... Args>
std::string makeString(Args...args){
std::string s;
int temp[] = { (s += toString(args),0)... }; // concatenation
static_cast<void>(temp);
return s;
}
для toString
, который вы предоставляете перегрузки для обработки всех типов, которые вы хотите.
Например:
template<class T>
std::string toString(T t){
return std::to_string(t); // for numbers
}
std::string toString(const std::string& str){
return str;
}
std::string toString(const char* str){
return str;
}
Полная демонстрация
Хм, вы даже не используйте toString
, версия с ostringstream
:
template<class ... Args>
std::string makeString(Args&&...args){
std::ostringstream os;
int temp[] = { ((os << std::forward<Args>(args)),0)... };
static_cast<void>(temp);
return os.str();
}