Чего я хочу добиться, так это иметь перегрузки функции, которые работают для строковых литералов и 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);
}
Я недоволен тем, что он компилируется для переменной массива символов, но я думаю, что нет никакого способа обойти это, если я хочу принимать строковые литералы (если есть, скажите мне)
Однако я хотел бы избежать того, что перегрузка std::string
принимает const char * const
переменных. К сожалению, я не могу просто объявить удаленную перегрузку, которая принимает параметр const char * const&
, потому что это также соответствовало бы строковому литералу.
Любая идея, как я могу заставить foo(c_ptr)
выдавать ошибку времени компиляции, не затрагивая другие перегрузки?
const char *& str
) больше не нужна, верно? 06.01.2016