0

我有一个 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;}
4

4 回答 4

2

我不是 100% 确定我理解你的问题,所以我可能完全错过了这里的标记。但是,如果您将函数设为模板:

template<typename IntType>
static bool specificSearch(IntType &matchLocation, const SearchSpecs &specs) {/**/}

这将允许您将任一类型传递给它。

于 2012-03-20T22:03:07.393 回答
1

您的基本问题是您的函数specificSearch分配给一个int对象。但是你想要写的是一个unsigned int对象。幸运的是,严格的别名规则允许我们unsigned int像写一个int. 类型系统并不完全鼓励它,但可以说服:

searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);

这种类型依赖于被写入的值在两种类型的公共范围内(0 到INT_MAX)。我说“有点”,因为在 2 的补码系统上,写入该范围之外的值的结果与将值转换为 的结果相同unsigned int。在非 2 的补码系统上,实际上不存在但原则上困扰着我们对可移植代码的尝试,结果是不同的,因此可能是错误的。

如果可能的话,定义一个重载可能会更好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为正确的类型会更明智。

于 2012-03-20T22:00:59.687 回答
1

您可以使用模板执行此操作:

template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs) {/**/}

并赋值给matchLocation函数内部。这样,您可以使用可以分配给您matchLocation在函数中分配的任何类型的任何类型。

如果出于某种原因,您不喜欢这样,并且希望它仅与intand一起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;
}

请注意,您可能会收到有关在这些函数之间进行转换intunsigned int使用这些函数的警告,因为这两种类型的范围不同。

于 2012-03-20T22:05:53.580 回答
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)。

如果有任何不清楚或我错过了重点,请发表评论,我会调整我的答案。

于 2012-03-20T21:56:35.350 回答