我想要實現的是重載函數的重載,它適用於字符串文字和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