C++ 默认参数的便利
有时管理两个函数的类似版本实在太费劲,所以C++提供了一种补救机制:默认参数。默认参数是指在函数申明的时候已经设置函数参数的默认值,若函数调用的时候没有制定函数参数值,则采用申明时的默认值。
应用举例
类BufContainer存在push方法如下:
#define GET_GPU_DATA 0x00
struct Item
{
int dataSize;
DWORD dataType;
std::shared_ptr<uint8_t> data;
LONGLONG dataTimeTag;
};
bool BufContainer::push(const uint8_t *pData, int dataSize)
{
if(!pData || (dataSize <=0))
{
LOGE << "invaild data";
return false;
}
Item item;
item.dataSize = dataSize;
item.dataType = GET_GPU_DATA;
item.data = std::shared_ptr<uint8_t>(new uint8_t[dataSize], std::default_delete<uint8_t[]>());
item.dataTimeTag = Timer::currentTick();
memcpy((uint8_t *)item.data.get(), pData, dataSize);
return addItemToQueue(&item);
}
代码中默认的Item的dataType为GET_GPU_DATA类型,将pData中的数据封装成Item格式并加入队列中。push方法的调用如下:
(new BufContainer())->push(pInputBuf, iInputBufSize);
此时,若需要增加Item 中datatype 的类型又不想修改对原来push(const uint8_t *pData, int dataSize)方法的调用,则修改push方法的声明如下:
bool BufContainer::push(const uint8_t *pData, int dataSize, DWORD dataType = GET_GPU_DATA);
对应的push方法修改如下:
bool BufContainer::push(const uint8_t *pData, int dataSize, DWORD dataType )
{
if(!pData || (dataSize <=0))
{
LOGE << "invaild data";
return false;
}
Item item;
item.dataSize = dataSize;
item.datayType = dataType;
item.data = std::shared_ptr<uint8_t>(new uint8_t[dataSize], std::default_delete<uint8_t[]>());
item.dataTimeTag = Timer::currentTick();
memcpy((uint8_t *)item.data.get(), pData, dataSize);
return addItemToQueue(&item);
}
.
保持原有的push方法调用格式不变,后续增加dataType类型使用如下:
(new BufContainer())->push(pInputBufData, iInputBufDataSize, GET_GPU_CURSOR);