如何将 2 个函数(const & non-const i/o)“合并”为一个?

How to "merge" 2 functions (const & non-const i/o) into one?

提问人:Sasha 提问时间:11/14/2023 最后编辑:AmitSasha 更新时间:11/17/2023 访问量:173

问:

是否有将以下 2 个函数合并为一个函数的语法,以便如果输入为 ,则 result 为 ,如果输入为 non-const,则 result 为 non-const?constconst

char* f1(char* x) {
    return x+1;
}

const char* f2(const char* x) {
    return x+1;
}

C++ 常量 多态性 函数-模板-重载

评论

5赞 Some programmer dude 11/14/2023
可能有,但它会比普通的重载更复杂。
0赞 Paul Sanders 11/14/2023
如果可以使用 C++23,这可能会有所帮助: devblogs.microsoft.com/cppblog/cpp23-deducing-this 在此阶段,很可能只有 MSVC 实现了这一点。
0赞 pptaszni 11/14/2023
你是说这样?但它似乎并不比简单地使用不同的功能更具可读性。
0赞 Cem Polat 11/14/2023
您可以使用模板函数,例如 template <typename T> T foo(T x) { return x + 1;
1赞 Fareanor 11/14/2023
不相关的:除非使用指向数组元素的指针(而不是最后一个元素)调用,否则如果取消引用此类无效指针,则这些函数会为未定义行为打开大门。

答:

4赞 463035818_is_not_an_ai 11/14/2023 #1

char* f1(char* x) {
    return x+1;
}

const char* f1(const char* x) {   // rename f2->f1
    return x+1;
}

不会使它成为“一个函数”,但它是一组重载,对于用户来说,它实际上是多个函数并不重要,除非他们尝试获取地址。

有一些方法可以避免重复实现,也许最简单的方法是根据 const 重载实现 non-const 重载:

const char* f1(const char* x) {
    return x+1;
}

char* f1(char* x) {
    return const_cast<char*>(f1(static_cast<const char*>(x)));
}

在第二个重载中指向一个非常量,因此可以从另一个重载的结果中抛弃恒定性。xchar

评论

0赞 NathanOliver 11/14/2023
在证明类中的 const 和非 const 访问器时,此技术特别有用。允许您保留代码 DRY bay 在非常量版本中调用 const 版本。
4赞 user12002570 11/14/2023 #2

您可以制作一个函数模板,如下所示:

template <typename T>
auto foo(T *ptr)
requires(std::is_same_v<std::remove_const_t<T>, char>)
{
    return ptr+1;
}
0赞 Amit 11/14/2023 #3

简单模板:

#include <iostream>


template <typename T>
T* f(T* p)
{
    return p + 1;
}


int main()
{
    // const char pointer:
    const char cca[]{ "Hello" };
    const char* ccp{ f(cca) };
    std::cout << *ccp << std::endl; // 'e'
    
    // char pointer:
    char ca[6]{ "World" };
    char* cp{ f(ca) };
    std::cout << *cp << std::endl; // 'o'
}

演示