常量字符*、常量字符(&)[N] 和 std::string 的函数重载
Function overloading for const char*, const char(&)[N] and std::string
我想要实现的是重载一个函数,该函数适用于字符串文字和std::string
,但会对const char*
参数产生编译时错误。以下代码几乎可以满足我的要求:
#include <iostream>
#include <string>
void foo(const char *& str) = delete;
void foo(const std::string& str) {
std::cout << "In overload for const std::string& : " << str << std::endl;
}
template<size_t N>
void foo(const char (& str)[N]) {
std::cout << "In overload for array with " << N << " elements : " << str << std::endl;
}
int main() {
const char* ptr = "ptr to const";
const char* const c_ptr = "const ptr to const";
const char arr[] = "const array";
std::string cppStr = "cpp string";
foo("String literal");
//foo(ptr); //<- compile time error
foo(c_ptr); //<- this should produce an error
foo(arr); //<- this ideally should also produce an error
foo(cppStr);
}
我很不高兴,它是为char数组变量编译的,但我认为如果我想接受字符串文字(如果有,请告诉我),就没有办法绕过它
但是,我想避免的是std::string
重载接受const char * const
变量。不幸的是,我不能只声明一个带有const char * const&
参数的已删除重载,因为它也会匹配字符串文字。
你知道吗,我怎么能让foo(c_ptr)
在不影响其他重载的情况下产生编译时错误?
此代码执行所需操作(除了数组-文字是数组,因此无法将它们分离)
#include <cstddef>
#include <string>
template <class T>
void foo(const T* const & str) = delete;
void foo(const std::string& str);
template<std::size_t N>
void foo(const char (& str)[N]);
int main() {
const char* ptr = "ptr to const";
const char* const c_ptr = "const ptr to const";
const char arr[] = "const array";
std::string cppStr = "cpp string";
foo("String literal");
//foo(ptr); //<- compile time error
// foo(c_ptr); //<- this should produce an error
foo(arr); //<- this ideally should also produce an error
foo(cppStr);
}
为了使被删除的函数而不是比模板函数更好地匹配,以便字符串文字仍然有效,被删除的功能也需要是模板。这似乎满足了您的要求(尽管阵列仍然是允许的):
template <typename T>
typename std::enable_if<std::is_same<std::decay_t<T>, const char*>::value>::type
foo(T&& str) = delete;
演示。
在该语言的现代版本中,您可以创建一些自定义类型和用户定义的文字来创建它,这样就可以传递"this"_SOMEWORDS
,而不仅仅是c字符串文字、聊天指针或char数组。
它不能完全满足您传递字符串文字的要求,但我认为它已经足够好了,尤其是因为它还禁止数组
相关文章:
- 如何循环访问常量字符**?
- constexpr 函数获取常量字符*
- 如何计算常量字符**中的总字符数?
- QDial:如何将 int 值传递给需要常量字符*的 Qfile?
- 为什么 std::string_view 比常量字符*快?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 在编译时将常量字符* 转换为常量 char_type*
- 将字符串数组传递给接受常量字符**的函数
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 字符串强制转换为常量字符*
- 使用常量字符*时退出代码 139
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法<string>从"常量字符 []"转换为<类名>
- 初始化常量字符* 数组
- 常量字符*的性质是什么?
- C++ 获取向量中常量字符* [ ] 的长度
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- C++将常量字符* 指针数组传递给对象