我现在有一个对象向量,以及一个可以接受对象作为参数的预定义函数。我只是想知道是否有一种方法可以将这些对象传递给这个函数?
std::vector<obj> objects; //contains obj1, obj2 .., objn
我希望实现类似于这样的效果:
foo(obj1, obj2 ... , objn) //foo can take as many objects as I want
我现在有一个对象向量,以及一个可以接受对象作为参数的预定义函数。我只是想知道是否有一种方法可以将这些对象传递给这个函数?
std::vector<obj> objects; //contains obj1, obj2 .., objn
我希望实现类似于这样的效果:
foo(obj1, obj2 ... , objn) //foo can take as many objects as I want
虽然在像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!");
}
}
是的,在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;
}
for
循环改为 range-for 循环,你就不再需要 size
和 objs[]
本地变量了: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 Lebeauvoid f(const std::initializer_list<obj> &args) { objects.insert(objects.end(), args.begin(), args.end()); }
,然后你可以这样做 f({obj1, obj2, obj3});
。 - Remy Lebeau我认为没有。
话虽如此,你的 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++中,这是实现非常相似(并且更加干净)的标准方法。
std::vector
是一个对象本身,你可以将它作为参数传递并在函数foo
内部使用它(访问其元素)。 - BobMoranefoo
是一种惯用的方法。 - Mooing Duck