如何使用std:字符串参数迭代variadic函数


void foo(std::string arg, ...) {
   // do something with every argument
}

可以说,我希望能够获取每个字符串参数,并在将其打印在新行中之前,并附加一个感叹号。

最好的方法是使用参数包。例如:

#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!

c 17

使用parameter pack使用fold 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;
}

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

#include <iostream>
#include <string>
#include <initializer_list>
#include <functional> // reference_wrapper
void foo(std::initializer_list<std::reference_wrapper<std::string>> args) {
    for (auto arg : args) {
        arg.get().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;
}

最新更新