C++ 如何通过引用或指针将`int`和`unsigned int`成员传递给同一个函数?
我有一个20-30行C++函数,它引用了<代码> int >代码>以进行可能的更新。现在,我将用封装更多数据的成员的成员替换传递给它的成员,类似于:C++ 如何通过引用或指针将`int`和`unsigned int`成员传递给同一个函数?,c++,pointers,reference,casting,unsigned-integer,C++,Pointers,Reference,Casting,Unsigned Integer,我有一个20-30行C++函数,它引用了 int >代码>以进行可能的更新。现在,我将用封装更多数据的成员的成员替换传递给它的成员,类似于: searchState.matchedOK = specificSearch(*pageIndices.GetStringIByRef(), searchState); //new, and overwritten. searchState.matchedOK = specificSearch(pageOffsetInText, searchState);
searchState.matchedOK = specificSearch(*pageIndices.GetStringIByRef(), searchState); //new, and overwritten.
searchState.matchedOK = specificSearch(pageOffsetInText, searchState); //old
我想将此修改定位到上面调用的行和函数,因为在我验证了等价性之后应该删除旧成员
对于简单的强制转换,这可能吗
如果您需要代码:
static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}
以及最近增加的成员:
inline unsigned int *GetStringIByRef() {return &stringI;}
我在这里看到几个问题。首先,根据您的意图,最好只按值返回
stringI
。否则,您可以按如下方式调整其签名:
inline unsigned int &GetStringIByRef() { return stringI; }
searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);
以便于使用C++引用。< /P> 至于
static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}
你可以这样称呼它:
inline unsigned int &GetStringIByRef() { return stringI; }
searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);
searchState.matchedOK=specificSearch(reinterpret_cast(pageindex.GetStringIByRef()),searchState);
仍然取决于对象本身(如果它是const
),我认为
如果有什么不清楚或我没有抓住要点,请发表评论,我会调整我的答案。我在这里看到了几个问题。首先,根据您的意图,最好只按值返回
stringI
。否则,您可以按如下方式调整其签名:
inline unsigned int &GetStringIByRef() { return stringI; }
searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);
以便于使用C++引用。< /P> 至于
static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}
你可以这样称呼它:
inline unsigned int &GetStringIByRef() { return stringI; }
searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);
searchState.matchedOK=specificSearch(reinterpret_cast(pageindex.GetStringIByRef()),searchState);
仍然取决于对象本身(如果它是const
),我认为
如果有什么不清楚或我没有抓住要点,请发表评论,我会调整我的答案。您的基本问题是您的函数
specificSearch
分配给int
对象。但是您需要编写的是一个无符号int
对象。幸运的是,严格的别名规则允许我们像写入int
一样写入无符号int
。类型系统并不鼓励它,但可以说服:
searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);
这假设包装函数可以判断是否将“real”specificSearch
分配给loc
,以便知道是否将matchLocation
分配给它。如果调用函数无法以某种方式解决这个问题,那么这就不会真正起作用(如果允许specificSearch
分配然后抛出异常,那么您也需要对此进行说明)
如果可能的话,将
stringI
更改为正确的类型会更明智。您的基本问题是您的函数specificSearch
分配给int
对象。但是您需要编写的是一个无符号int
对象。幸运的是,严格的别名规则允许我们像写入int
一样写入无符号int
。类型系统并不鼓励它,但可以说服:
searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);
这假设包装函数可以判断是否将“real”specificSearch
分配给loc
,以便知道是否将matchLocation
分配给它。如果调用函数无法以某种方式解决这个问题,那么这就不会真正起作用(如果允许specificSearch
分配然后抛出异常,那么您也需要对此进行说明)
如果可能的话,将
stringI
更改为正确的类型会更明智。我不能100%确定我是否理解您的问题,因此我可能完全没有理解这里的要点。但如果将函数设置为模板:
template<typename IntType>
static bool specificSearch(IntType &matchLocation, const SearchSpecs &specs) {/**/}
模板
静态bool specificSearch(IntType和matchLocation,const SearchSpecs和specs){/**/}
这将允许您将任意一种类型传递给它。我不能100%确定我是否理解您的问题,因此我可能完全没有理解这里的要点。但如果将函数设置为模板:
template<typename IntType>
static bool specificSearch(IntType &matchLocation, const SearchSpecs &specs) {/**/}
模板
静态bool specificSearch(IntType和matchLocation,const SearchSpecs和specs){/**/}
这将允许您将任意一种类型传递给它。您可以使用模板执行此操作:
template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs) {/**/}
请注意,如果使用这些函数在
int
和unsigned int
之间进行转换,您可能会收到警告,因为这两种类型的范围不同。您可以使用模板执行此操作:
template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs) {/**/}
请注意,如果使用这些函数在
int
和unsigned int
之间进行转换,您可能会收到警告,因为这两种类型的范围不同。发布函数的新原型和旧原型是有意义的,但一般来说,这应该适用于C风格强制转换或静态强制转换
@STATUS\u ACCESS\u DENIED:我一直在函数签名(原型?)中尝试*、&、unsigned等,都没有用static\u cast
是正常的C
cast,不是吗?我可以将stringI
更改为signed,但在以后的阶段,我可能需要将其MSB用作布尔标志。现在我们讨论的是,对于签名,这个问题更有意义:)发布新的和旧的函数原型是有意义的,但一般来说,这应该适用于C风格强制转换或静态强制转换
@STATUS\u ACCESS\u DENIED:我一直在函数签名(原型?)中尝试*、&、unsigned等,都没有用static\u cast
是正常的C
cast,不是吗?我可以将stringI
更改为signed,但我可能需要在稍后的阶段将其MSB用作布尔标志。现在我们讨论的是,对于签名,问题更有意义:)“从“unsigned int”类型的表达式初始化类型为“int&”的引用无效”,在调用specificSearch
now“从类型为“unsigned int”的表达式初始化类型为“int&”的引用无效”时,在调用specificSearch
now@John:与您之前实例化它的位置相同。