将std :: string转换为ci_string

时间:2015-11-15 17:36:25

标签: c++ casting typedef case-sensitive char-traits

我使用this approach为字符串创建不区分大小写的typedef。现在,我正在尝试将std::string转换为ci_string。所有以下抛出编译器错误:

std::string s {"a"};
ci_string cis {s};
ci_string cis (s);
ci_string cis {(ci_string)s};
ci_string cis ((ci_string)s);
ci_string cis = s;

我花了一些时间试图弄清楚如何重载=运算符,我尝试使用static_castdynamic_cast但没有成功。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您的两种类型不同,因此您不能将构造函数与常规std::string s{"a"}; ci_string cis{ s.data() }; // or s.c_str(), they are the same 一起使用。但是你的字符串仍然可以复制一个C字符串,所以这应该有效:

{{1}}

答案 1 :(得分:1)

std::stringci_string无关类型。为什么static_castdynamic_cast能够转换它们?请记住:同一模板的两个不同实例是不相关的类型,可能完全不兼容。

放弃重载operator=或某些自动执行转化的魔法的想法。你有两种不相关的类型。但它们都提供了成员函数,您可以成功地将char元素从一个元素复制到另一个元素。

只需编写一个简单的转换函数,利用std::stringci_stringvalue_type定义为char这一事实,并恰当地使用#include <string> #include <iostream> struct ci_char_traits : public std::char_traits<char> { static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); } static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); } static bool lt(char c1, char c2) { return toupper(c1) < toupper(c2); } static int compare(const char* s1, const char* s2, size_t n) { while( n-- != 0 ) { if( toupper(*s1) < toupper(*s2) ) return -1; if( toupper(*s1) > toupper(*s2) ) return 1; ++s1; ++s2; } return 0; } static const char* find(const char* s, int n, char a) { while( n-- > 0 && toupper(*s) != toupper(a) ) { ++s; } return s; } }; typedef std::basic_string<char, ci_char_traits> ci_string; ci_string to_ci_string(std::string const& src) { return ci_string(src.begin(), src.end()); // or: // return ci_string(src.c_str()); } int main() { std::string s {"a"}; auto cis = to_ci_string(s); std::cout << cis.c_str() << "\n"; } 之一3}},既可以是指向原始数据的指针,也可以是采用两个形成范围的迭代器的指针。

这是一个完整的例子:

$var