我希望函数具有一个具体类型的通用引用参数.我希望它是通用引用,所以当我不想检查存储在其中的值时,我可以传递一个临时对象.
这是一个例子:
bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, size_t &szComparedData)
{
size_t &i = szComparedData;
for (; arg_1[i]; ++i)
if (arg_1[i] != arg_0[i])
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
可能的函数调用:
bCompareData(Obj.uIdObject.data(), Ref.uIdTargetObject.data(), size_t()) // here we are passing a temporary (rvalue)
/*________________________*/
size_t lval;
bCompareData(Obj.uIdObject.data(), Ref.uIdTargetObject.data(), lval) // here we are passing a named variable (lvalue)
Run Code Online (Sandbox Code Playgroud)
在第一个函数调用编译器中使用上述函数声明将给出错误,如果我将"size_t&szComparedData"更改为rvalue引用"size_t && szComparedData",它将在第二次调用时失败.
现在我需要的是Universal References,但我也希望在我的论证中有一个具体的类型,而不是使用模板.
我正在使用VC++ U3 2013编译器.
通用引用仅根据定义使用模板和类型推导.您只能使用SFINAE来限制对特定类型的引用:
template< typename S >
typename std::enable_if<
std::is_same<typename std::decay<S>::type,size_t>::value,
bool>::type
bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, S&& szComparedData)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的需要避免模板,你需要重载你的方法:
bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, size_t& szComparedData)
{
// ...
}
bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, size_t&& szComparedData)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)