不同的对象作为同一函数的参数

时间:2012-10-08 15:28:18

标签: c++ oop templates object parameter-passing

是否可以将不同的对象作为1函数的参数传递,而不是传递3个函数

void someFunction(Object o) {
     //working with object, all that objects have same fields to work with
     // i.e. all objects have x, y fields and this function is working with it
}

Player pl;
Item itm;
Block bl;

someFunction(pl);
someFunction(itm);
someFunction(bl);

也许可以使用模板或什么来完成? 我不想为不同的对象制作具有相同代码的3个函数

5 个答案:

答案 0 :(得分:3)

是的,使用模板:

template<class Type> void someFunction(const Type& o) {
     //working with object, all that objects have same fields to work with
     // i.e. all objects have x, y fields and this function is working with it
}

请注意,您可能更愿意通过const引用传递o,而不是通过值传递。我在这里做到了。

答案 1 :(得分:1)

是的,模板应该有效:

template <typename T>
void someFunction(T & o)
{
    // use o.x, o.y, o.z
}

您可以通过引用或const引用传递,具体取决于您是否要修改原始对象。

答案 2 :(得分:1)

模板可以用作一类类型的别名。以下内容允许任何类型通过f

的参数
template <typename T> void f(T & t) {
    // ...
}

答案 3 :(得分:1)

模板应该可以使用,但是如果不考虑SFINAE,就不能保证所有给定的对象都有一些字段。

另一个解决方案可能是继承here some sample code

struct Foo
{
    int x;
    int y;
};

struct Bar: public Foo
{
    int another_x;
};

struct Baz: public Foo
{
    int another_y;
};

void someFunction(const Foo &foo)
{
    std::cout << foo.x << '\n';
    std::cout << foo.y << '\n';
};

使用这种方法,您可以确保所有给定对象都具有所需的成员。

答案 4 :(得分:0)

您可以使用模板或多态(可能是具有虚拟方法的父接口来获取和设置相关字段)来执行此操作。

模板可以工作并且可能已经过很好的优化,但不允许以后传递新对象,无论它们是否具有相同的字段。您将能够编译新代码和新对象以使用模板函数,但现有调用将被卡在一个类型中。

使用父接口和虚方法,然后让你的函数调用那些方法(可能是getter和setter)来处理字段操作将在以后提供更多的自由,代价是稍高的运行时并且必须从该接口继承(但是,它允许新对象随时传递给函数,只要它们实现接口)。