我希望函数具有一个具有具体类型的通用引用参数。我希望它是通用引用,这样当我对检查存储在其中的值不感兴趣时,就可以传递一个临时对象。
下面是一个例子:
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;
}而可能的函数调用:
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编译器。
发布于 2014-11-04 19:01:18
通用引用只适用于模板和定义的类型推断。您只能使用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)
{
// ...
}或者,如果确实需要避免模板,则需要重载您的方法:
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)
{
// ...
}发布于 2014-11-04 19:03:35
不能有通用引用而不使用模板,因为“通用引用”是一种模板。您想要的是能够传递一个lvalue或rvalue,这可以不使用模板来完成。
这里正确的工具是重载。有趣的是,这只需要非常简单的过载。
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,您可以简单地将它传递给现有的函数。
发布于 2014-11-04 19:11:10
或者我后来做的事情,我认为这不是最好的解决办法:
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’引用具有相同的大小和属性,那么它们是如何变成不同类型的。
https://stackoverflow.com/questions/26742898
复制相似问题