函数 findx() 中是不是有 const_cast<char*> 的替代方法?

Posted

技术标签:

【中文标题】函数 findx() 中是不是有 const_cast<char*> 的替代方法?【英文标题】:Is there an alternative to const_cast<char*> within the function findx()?函数 findx() 中是否有 const_cast<char*> 的替代方法? 【发布时间】:2015-12-25 14:25:39 【问题描述】:

我正在尝试使用以下签名实现一个函数:char* findx (const char* s, const char* x),其中两个参数是 C 风格的字符串,返回值是指向 s 中第一次出现的 x 的指针。

这是我的实现:

char* findx (const char* s, const char* x) 
    // check if s and x valid pointers
    assert(s);
    assert(x);

    // get lengths of s and x
    size_t len_s = m_strlen(s);
    size_t len_x = m_strlen(x);

    // check if x substring (or equal to) of s
    assert(len_s >= len_x);

    char* p_to_match = nullptr;

    // traverse s
    for (size_t i = 0; i < len_s; ++i) 

        if (*(s + i) == *x) 
            p_to_match = const_cast<char*>(s + i);
            //-----------^ can't assing const char* to char* ???

            if (len_x == 1) return p_to_match;

            // the current s's matched the x's zeroth, so next test is for the next elements
            const char* next_s = (s + i + 1);
            const char* first_x = (x + 1);

            for (size_t j = 0; j < len_x - 1; ++x) 
                // if any of the rest of x's elements don't match, break the inner for loop
                if (*(next_s + j) != *(first_x + j)) break;

                // if all the rest of x's elements match return ref_to_match
                if (j == len_x - 2) return p_to_match;
            
        
    
    return nullptr;

我遇到的问题是我不喜欢显式类型转换 (const_cast&lt;char*&gt;) 并且我想用其他东西替换它,但是目前我无法看到如何在不更改返回值的情况下执行此操作 (到const char*)或论点(到char* s),所以我的问题是:

有没有办法实现函数,特别是返回变量,不用const_cast&lt;char*&gt;,不改变函数签名?

【问题讨论】:

IMO,调用者应该是做演员的人。 旁注:您将const char* 作为参数并返回char*。因此,从概念上讲,您允许更改 char* 的基础值。但如果它是const char* 的一部分,那么您也允许自己更改const char*。这在概念上是错误的。如果您想让它们保持相关,您应该将它们全部设为 const 或全部设为 non-const。 【参考方案1】:

您应该将p_to_match 和结果类型设为函数const char*。如果没有 const_cast,您不能返回 char* 以指向您拥有的 const char* 字符串

如果可能的话,您可以允许将(非 const char* 返回类型)写入您的参数 const(例如通过传递 findx(s, s))。这意味着const 根本没有意义

schar*const char*sconst char* 时,您可能还想返回char*。您可以为该模板或模板使用两个单独的函数。

【讨论】:

感谢您的回答。所以,我应该重载constness 上的函数,以根据参数提供两种返回类型,对吧? 是的,您可以重载它们或使用模板。重载是更好的界面,表明您确实有 2 个实现(而不是每种类型),使用模板更容易共享代码

以上是关于函数 findx() 中是不是有 const_cast<char*> 的替代方法?的主要内容,如果未能解决你的问题,请参考以下文章

OPPO Find X5系列领衔OPPO春季新品发布会,多款产品亮相

安卓手机重度使用会卡吗?给OPPO Find X装578个APP,和新机比比

并查集模板(算法)

如何在 CLion 中链接库

如何根据另一个字典查找和替换一个字典中的值

在 Python 中嵌套函数时是不是有开销?