具体类型的通用参考

AnA*_*ons 2 c++

我希望函数具有一个具体类型的通用引用参数.我希望它是通用引用,所以当我不想检查存储在其中的值时,我可以传递一个临时对象.

这是一个例子:

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编译器.

Dan*_*rey 5

通用引用仅根据定义使用模板和类型推导.您只能使用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)