如何将 2 个函数(常量和非常量 i/o)“合并”为一个?

问题描述 投票:0回答:3

是否有一种语法可以将以下 2 个函数合并为一个,以便如果输入为

const
,则结果为
const
,如果输入为非常量,则结果为非常量?

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

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

c++ constants polymorphism overloading function-templates-overloading
3个回答
4
投票

这个

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

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

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

有很多方法可以避免重复实现,也许最简单的就是根据 const 实现非常量重载:

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

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

在第二个重载中

x
指向非常量
char
,因此可以从另一个重载的结果中丢弃常量性。


4
投票

您可以制作如下所示的函数模板:

template <typename T>
auto foo(T *ptr)
requires(std::is_same_v<std::remove_const_t<T>, char>)
{
    return ptr+1;
}

0
投票

简单模板:

#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'
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.