提问人:Sasha 提问时间:11/14/2023 最后编辑:AmitSasha 更新时间:11/17/2023 访问量:173
如何将 2 个函数(const & non-const i/o)“合并”为一个?
How to "merge" 2 functions (const & non-const i/o) into one?
问:
是否有将以下 2 个函数合并为一个函数的语法,以便如果输入为 ,则 result 为 ,如果输入为 non-const,则 result 为 non-const?const
const
char* f1(char* x) {
return x+1;
}
const char* f2(const char* x) {
return x+1;
}
答:
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)));
}
在第二个重载中指向一个非常量,因此可以从另一个重载的结果中抛弃恒定性。x
char
评论
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'
}
评论