在C++中将向量元素传递给函数

3

我现在有一个对象向量,以及一个可以接受对象作为参数的预定义函数。我只是想知道是否有一种方法可以将这些对象传递给这个函数?

std::vector<obj> objects; //contains obj1, obj2 .., objn

我希望实现类似于这样的效果:

 foo(obj1, obj2 ... , objn) //foo can take as many objects as I want

3
std::vector 是一个对象本身,你可以将它作为参数传递并在函数 foo 内部使用它(访问其元素)。 - BobMorane
1
不行,C++ 不是这样工作的。 - Sam Varshavchik
3
传递一个迭代器对给 foo 是一种惯用的方法。 - Mooing Duck
请查看此链接,其中显示如何声明具有可变参数的函数:https://www.cprogramming.com/tutorial/lesson17.html - Jorge Omar Medra
@JorgeOmarMedra:这意味着通过指针传递元素,而不是通过引用。 - Remy Lebeau
显示剩余2条评论
3个回答

1

虽然在像Python和Perl这样的脚本语言中很常见,但在C++中仍需要使用库解决方案。例如:

template<typename F, class Container> inline decltype(auto) apply(F f, Container const &args) {
    switch(args.size()) {
        case 0: return f();
        case 1: return f(args.front());
        case 2: return f(args[0], args[1]);
        case 3: return f(args[0], args[1], args[2]);
        // and so forth
        default: throw std::range_error("f does not accept that many arguments!");
    }
}

不会有一个库可以做到这一点,因为参数数量在编译时就已经确定了,而容器是动态的。你展示的开关也是一个编译错误,因为它不是可变参数的函数对象。 - Passer By
请定义可变参数函数对象。 - bipll

1

是的,在C++ 11中,您可以使用可变模板,像这样:

template<typename ...Ts>
void f(Ts...args);

以下是一个可工作的示例代码:
#include <vector>

class obj {
public:
    obj(int _id) {id = _id; }
    int id;
};

std::vector<obj> objects;

template<typename ...Ts>
void f(Ts...args) 
{
    const int size = sizeof...(args);
    obj objs[size] = { args... };

    for(int i=0;i<size;i++)
        objects.push_back(objs[i]);
}

int main()
{
    obj obj1(1), obj2(2), obj3(3);
    f(obj1, obj2, obj3);
    return 0;
}

1
如果你将 for 循环改为 range-for 循环,你就不再需要 sizeobjs[] 本地变量了:for(auto && arg: { args... }) { objects.push_back(arg); }。否则,你可以完全摆脱 for 循环:const obj objs[sizeof...(args)] = { args... }; objects.insert(objects.end(), std::begin(args), std::end(args)); 或者 void f() {} template<typename ...Ts> void f(obj first, Ts... rest) { objects.push_back(first); f(rest...); } - Remy Lebeau
或者使用 void f(const std::initializer_list<obj> &args) { objects.insert(objects.end(), args.begin(), args.end()); },然后你可以这样做 f({obj1, obj2, obj3}); - Remy Lebeau
@RemyLebeau 谢谢,这将使代码更简洁。 - James Dong

0

我认为没有。

话虽如此,你的 std::vector<obj> 也是一个对象,你可以将其作为参数传递给函数(间接传递其内容)。例如,如果你需要修改 obj1 或其他任何对象,你可以这样编写你的函数:

void foo(std::vector<obj>& p_objects)
{
    // Do something to obj1 and so on using p_objects.
}

如果你不需要修改obj1objn,那么使用一个const引用:
void foo(const std::vector<obj>& p_objects)
{
    // Do something to obj1 and so on using p_objects, 
    // but you can't modify anything!
}

我知道这不完全是你要找的,但在C++中,这是实现非常相似(并且更加干净)的标准方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接