如何使用std:string参数迭代可变参数函数?

时间:2016-12-20 07:32:13

标签: c++ variadic

void foo(std::string arg, ...) {

   // do something with every argument

}

让我们说我希望能够获取每个字符串参数并附加一个感叹号,然后再在新行上打印出来。

3 个答案:

答案 0 :(得分:5)

最好的方法是使用parameters pack。例如:

#include <iostream>

// Modify single string.
void foo(std::string& arg)
{
    arg.append("!");
}

// Modify multiple strings. Here we use parameters pack by `...T`
template<typename ...T>
void foo(std::string& arg, T&... args)
{
    foo(arg);
    foo(args...);
}

int main()
{
    // Lets make a test

    std::string s1 = "qwe";
    std::string s2 = "asd";

    foo(s1, s2);

    std::cout << s1 << std::endl << s2 << std::endl;

    return 0;
}

这将打印出来:

qwe!
asd!

答案 1 :(得分:0)

这是一个迭代的解决方案。函数调用中有些杂音,但是不需要计算可变参数的数量。

ASTextNode

答案 2 :(得分:0)

C ++ 17

parameter packfold expression一起使用:

#include <iostream>
#include <string>

// Modify multiple strings. Here we use parameters pack by `...T`
template<typename ...T>
void foo(T&... args)
{
    (args.append("!"),...);
}

int main()
{
    // Lets make a test

    std::string s1 = "qwe";
    std::string s2 = "asd";

    foo(s1, s2);

    std::cout << s1 << std::endl << s2 << std::endl;

    return 0;
}