我想要实现的是重载函数的重载,它适用于字符串文字和std::string
,但会产生编译时错误const char*
参数。下面的代码做几乎什么,我想:函数重载为const char *,const char(&)[N]和std :: string
#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)
产生一个编译时错误,而不会影响其他重载?
char *数组和字符串的类型之间没有区别*,所以你不能在没有其他数据的情况下抛出一个。但我认为你的其他要求是可以满足的。 –
@Tavian Barns:我想知道如果可以使用这个事实,字符串文字也是一个常量表达式(当然你也可以创建一个constexpr数组) – MikeMB