C++ 如何通过引用或指针将`int`和`unsigned 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);

我有一个20-30行C++函数,它引用了<代码> int >代码>以进行可能的更新。现在,我将用封装更多数据的成员的成员替换传递给它的成员,类似于:

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:与您之前实例化它的位置相同。