我有一个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;}
答案 0 :(得分:2)
我不是100%肯定我理解你的问题,所以我可能会完全错过这里的标记。但是如果你把你的功能变成一个模板:
template<typename IntType>
static bool specificSearch(IntType &matchLocation, const SearchSpecs &specs) {/**/}
这将允许您将任一类型传递给它。
答案 1 :(得分:1)
您的基本问题是您的函数specificSearch
会分配给int
个对象。但是你要写的东西是unsigned int
对象。幸运的是,严格的别名规则允许我们写入unsigned int
,就好像它是int
一样。类型系统并不完全鼓励它,但可以说服:
searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);
这种类型依赖于写入的值在两种类型的公共范围内(0到INT_MAX
)。我说“有点”,因为在2的补码系统中,写入该范围之外的值的结果与将值转换为unsigned int
的结果相同。在非二进制补码系统中,实际上并不存在,但原则上困扰我们对可移植代码的尝试,结果是不同的,因此可能是错误的。
如果可能的话,定义specificSearch
:
static bool specificSearch(unsigned int &matchLocation, const SearchSpecs &specs) {
int loc;
bool retval = specificSearch(loc, specs);
if (retval) { // I'm guessing here about the meaning of the return value
matchLocation = loc; // converts int to unsigned int
}
return retval;
}
这假设包装函数可以判断是否分配给specificSearch
的“真实”loc
,以便它知道是否分配给matchLocation
。如果调用函数无法以某种方式解决这个问题,那么这不会真正起作用(如果允许specificSearch
分配然后抛出异常,那么你也需要考虑到这一点)。
如果可能的话,将stringI
更改为正确的类型会更明智。
答案 2 :(得分:1)
您可以使用模板执行此操作:
template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs) {/**/}
并在函数内部分配matchLocation
。这样,您可以使用任何类型,可以将其分配给您在函数中分配给matchLocation
的任何类型。
如果由于某种原因,您不喜欢它,并且您希望它仅适用于int
和unsigned int
,则可以使用模板专业化:
// leaving this undefined, which will cause a linker error if you use it with other types
template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs);
template<>
static bool specificSearch<int>(int& matchLocation, const SearchSpecs& specs) {
/* definition */
}
template<>
static bool specificSearch<unsigned int>(unsigned int& matchLocation, const SearchSpecs& specs) {
// use the other one to avoid code duplication
int tmp = matchLocation;
bool retval = specificSearch(tmp, specs);
matchLocation = tmp;
return retval;
}
请注意,使用这些函数可能会在int
和unsigned int
之间收到警告,因为这两种类型的范围不同。
答案 3 :(得分:0)
我在这里看到几个问题。首先,根据您的意图,仅按值返回stringI
可能更好。否则,您可以按如下方式调整其签名:
inline unsigned int &GetStringIByRef() { return stringI; }
以便使用C ++引用。
至于
static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}
您可以将其称为然后,如下所示:
searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);
仍然取决于对象本身(如果它是const
),我估计。
如果有什么不清楚或我错过了这一点,请发表评论,我会调整我的答案。