首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混凝土型通用参考

混凝土型通用参考
EN

Stack Overflow用户
提问于 2014-11-04 18:58:03
回答 3查看 695关注 0票数 2

我希望函数具有一个具有具体类型的通用引用参数。我希望它是通用引用,这样当我对检查存储在其中的值不感兴趣时,就可以传递一个临时对象。

下面是一个例子:

代码语言:javascript
复制
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;
}

而可能的函数调用:

代码语言:javascript
复制
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)

如果我将"size_t &szComparedData“更改为rvalue引用"size_t &&szComparedData”,则在第二个调用时,使用第一个函数调用编译器中的上述函数声明将产生一个错误。

现在我需要的是通用引用,但我也希望在我的参数上有一个具体的类型,而不是使用模板。

我正在使用VC++ U3 2013编译器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-04 19:01:18

通用引用只适用于模板和定义的类型推断。您只能使用SFINAE限制对特定类型的引用:

代码语言:javascript
复制
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)
{
    // ...
}

或者,如果确实需要避免模板,则需要重载您的方法:

代码语言:javascript
复制
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)
{
    // ...
}
票数 5
EN

Stack Overflow用户

发布于 2014-11-04 19:03:35

不能有通用引用而不使用模板,因为“通用引用”是一种模板。您想要的是能够传递一个lvalue或rvalue,这可以不使用模板来完成。

这里正确的工具是重载。有趣的是,这只需要非常简单的过载。

代码语言:javascript
复制
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;
}
bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, size_t &&szComparedData)
{ return bCompareData(arg_0, arg_1, szComparedData);}

这是因为函数参数列表中的&&告诉我们,这个函数参数是由一个rvalue构造的,但是所有命名的值本身都是lvalue。因为它有名称,所以它是一个lvalue,您可以简单地将它传递给现有的函数。

票数 2
EN

Stack Overflow用户

发布于 2014-11-04 19:11:10

或者我后来做的事情,我认为这不是最好的解决办法:

代码语言:javascript
复制
template <typename T = size_t>

inline bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, T &&arg_2 = size_t())
{
    arg_2 = 0;

    extern bool _bCompareData(const uint8_t *, const uint8_t *, size_t &); //compare data

    return _bCompareData(arg_0, arg_1, arg_2);
}

C++是一种非常奇怪的语言。我的意思是,两个'rvalue‘和'lvalue’引用具有相同的大小和属性,那么它们是如何变成不同类型的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26742898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档