是否有一种语法可以将以下函数合并为一个,以便如果输入是 const,则结果是 const,如果输入不是 const,则结果也不是 const?
char* f1(char* x) {
return x+1;
}
const char* f2(const char* x) {
return x+1;
}
这个
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
,因此可以从另一个重载的结果中丢弃常量性。
您可以制作如下所示的函数模板:
template <typename T>
auto foo(T *ptr)
requires(std::is_same_v<std::remove_const_t<T>, char>)
{
return ptr+1;
}
简单模板(如果你没有 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'
}