1

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

IE

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 个函数

4

5 回答 5

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
}

请注意,您可能更喜欢o按 const 引用而不是按值传递。我在这里做了这个。

于 2012-10-08T15:31:30.387 回答
1

是的,模板应该可以工作:

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

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

于 2012-10-08T15:30:55.000 回答
1

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

template <typename T> void f(T & t) {
    // ...
}
于 2012-10-08T15:32:27.493 回答
1

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

另一个解决方案可能是继承一些示例代码

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';
};

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

于 2012-10-08T15:41:51.513 回答
0

您可以使用模板或多态性(可能是具有虚拟方法的父接口来获取和设置相关字段)来做到这一点。

模板可以工作并且可能会得到很好的优化,但不允许以后传入新对象,无论它们是否具有相同的字段。您将能够编译新代码和新对象以使用模板函数,但现有调用将停留在单一类型上。

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

于 2012-10-08T15:32:51.980 回答