将向量元素传递给c ++中的函数

时间:2017-11-17 01:11:06

标签: c++

我现在有一个对象矢量。以及可以将对象作为参数的预定义函数。只是好奇是否有将这些对象传递给此函数的方法?

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

我想要达到这样的目标:

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

3 个答案:

答案 0 :(得分: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 :(得分:0)

虽然像P(ython | erl)这样的脚本语言很常见,但这仍然需要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!");
    }
}

答案 2 :(得分:0)

我不认为有。

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

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

如果您不需要将obj1修改为objn,请使用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 ++实现非常相似(以及我的意见更清晰)的标准方式。