我想创建一个自定义打印函数,它接受任意数量的参数并将它们全部打印在新行上。
在javascript中,document.write和console.log函数可以执行此操作,因为javascript将所有参数存储在数组中。据我所知,c ++不会这样做,因为类型限制而不能。
那么在c ++中有没有正确的方法呢?取任何数量的参数,无论其类型如何,都打印出来?
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以使用variadic function,类似于printf,但您仍需要知道参数的类型以及能够正确访问它们的数量。
更好的方法可能是做类似于<<<<<运算符为ostream
重载或使用可链接函数。您最终仍将限于您知道的类型(或具有虚函数的超类型)。
答案 2 :(得分:1)
来自Bjarne本人:
http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates
他今天的代码:
void printf(const char* s)
{
while (s && *s) {
if (*s=='%' && *++s!='%') // make sure that there wasn't meant to be more arguments
// %% represents plain % in a format string
throw runtime_error("invalid format: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args> // note the "..."
void printf(const char* s, T value, Args... args) // note the "..."
{
while (s && *s) {
if (*s=='%' && *++s!='%') { // a format specifier (ignore which one it is)
std::cout << value; // use first non-format argument
return printf(++s, args...); // "peel off" first argument
}
std::cout << *s++;
}
throw std::runtime error("extra arguments provided to printf");
}