Я пытаюсь написать шаблон is_c_str
, чтобы проверить, является ли тип строкой c-style. Мне нужно это как попытку написать функцию to_string, как показано в моем другом вопросе здесь:
Специализация шаблона для итераторов контейнеров STL?.
Мне нужно отличить c_str и другие типы указателей и итераторов, чтобы я мог представлять первое значение по номиналу и отображать указатели/итераторы как непрозрачные "итор" или "ptr". Код выглядит следующим образом:
#include <iostream>
template<class T>
struct is_c_str
: std::integral_constant<
bool,
!std::is_same<char *, typename std::remove_reference<typename std::remove_cv<T>::type>::type>::value
> {};
int main() {
auto sz = "Hello"; //Or: const char * sz = "Hello";
int i;
double d;
std::cout << is_c_str<decltype(sz)>::value << ", "
<< is_c_str<decltype(i)>::value << ", "
<< is_c_str<decltype(d)>::value << std::endl;
}
Однако is_c_str
захватывает не только const char *
, но также int
и double
. Вышеупомянутый код выводит:
1, 1, 1
(как из gcc-4.8.1).
Мой вопрос в том, как исправить is_c_str
для правильного захвата строк c-style?