模板中无限量的泛型类型?

时间:2011-10-16 03:01:25

标签: c++ templates

我想创建一个自定义打印函数,它接受任意数量的参数并将它们全部打印在新行上。

在javascript中,document.write和console.log函数可以执行此操作,因为javascript将所有参数存储在数组中。据我所知,c ++不会这样做,因为类型限制而不能。

那么在c ++中有没有正确的方法呢?取任何数量的参数,无论其类型如何,都打印出来?

3 个答案:

答案 0 :(得分:2)

是的,有新的C + 11标准。请看一下这篇文章:

http://en.wikipedia.org/wiki/Variadic_template

还有一个非常好的例子,你可以用它作为首发。

答案 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");
}