如何在函数中创建引用参数optional(可选缓冲区)

时间:2011-06-19 01:32:19

标签: c++ reference default

所以我正在创建一个检测两个精灵之间碰撞的函数,并希望添加两个缓冲区作为可选参数,以填充每个对象碰撞的边的角度。

但是这意味着两个buff参数必须是引用,并且无论何时调用函数都必须存在,并且我不知道有任何方法可以进行默认引用。我该怎么做?

这是实际功能:

bool CheckCollision(T* obj1, T* obj2, float& CollBuff1= new float, float& CollBuff2= new float);

我尝试使用'new'进行默认设置,但它不起作用。

5 个答案:

答案 0 :(得分:8)

您可以重载该功能。只需定义第二个包装函数,如下所示:

bool CheckCollision(T *obj1, T *obj2)
{
    float dummy1, dummy2;
    return CheckCollision(obj1, obj2, dummy1, dummy2);
}

如果你愿意,只为一个浮点数定义第二个。

答案 1 :(得分:4)

使用Boost.Optional,没有指针,也没有样板重载:

bool CheckCollision(
    T* obj1, T* obj2,
    boost::optional<float&> CollBuff1 = boost::optional<float&>(),
    boost::optional<float&> CollBuff2 = boost::optional<float&>()
);

您可以通过执行if (CollBuff1)来测试您是否获得了参数,然后使用CollBuff1.get()访问引用(显然是以相同的方式访问另一个引用)。

答案 2 :(得分:1)

另一种(并且非常丑陋)的方法是:

#include <memory>

void test(int a, int& b = *std::auto_ptr<int>(new int())) {
     // ...
}

或在你的情况下

#include <memory>

bool CheckCollision(T* obj1, T* obj2,
    float& CollBuff1= *std::auto_ptr<float>(new float()),
    float& CollBuff2= *std::auto_ptr<float>(new float()));

答案 3 :(得分:1)

尝试为引用参数定义默认值时遇到的基本问题是非const引用无法绑定到临时对象或文字。

void foo(float &f = 1.0f) {} // doesn't compile
void foo(const float &f = 1) {} // OK

实际上这是合法的:

void foo(float &f = *(new float(1))) {}

但这是不可取的。函数中的代码无法判断是否使用默认参数调用它,因此您为自己创建了一个相当令人不愉快的资源处理问题:谁将要delete浮动,以及将会是什么在调用者 传递某些内容的情况下,该代码是做什么的? bdonlan的超载是可取的。

答案 4 :(得分:0)

@James McNellis现在删除(为什么?)答案指出了正确的解决方案:你没有。

使用指针,因为这些缓冲区显然是out-parameters(即,它们用于“返回”其他值)并相应地调用它:

bool CheckCollision(T* obj1, T* obj2, float* ColBuf1 = 0, float* ColBuf2 = 0){
  // your code...
  // ...
  // test before assigning:
  if(ColBuf1 != 0)
    *ColBuf1 = /*whatever you have*/;
  // same with ColBuf2
}

float ColBuf1, ColBuf2;
CheckCollision(SomeObjPtr, AnotherObjPtr, &ColBuf1, &ColBuf2);

或者,甚至更好,超载它:

bool CheckCollision(T* obj1, T* obj2);
bool CheckCollision(T* obj1, T* obj2, float* ColBuf1, float* ColBuf2);

虽然我仍然使用指针来指示那些缓冲区将被填充。