我现在有一个对象矢量。以及可以将对象作为参数的预定义函数。只是好奇是否有将这些对象传递给此函数的方法?
std::vector<obj> objects; //contains obj1, obj2 .., objn
我想要达到这样的目标:
foo(obj1, obj2 ... , objn) //foo can take as many objects as I want
答案 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 ++实现非常相似(以及我的意见更清晰)的标准方式。