如果参数是const,函数返回const,否则不是

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

是否有一种语法可以将以下函数合并为一个,以便如果输入是 const,则结果是 const,如果输入不是 const,则结果也不是 const?

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

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

c++ constants polymorphism
3个回答
3
投票

这个

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
,因此可以从另一个重载的结果中丢弃常量性。


3
投票

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

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

0
投票

简单模板(如果你没有 C++20):

#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; // 'e'
}

演示

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