C++ 将标准::字符串转换为ci_字符串

C++ 将标准::字符串转换为ci_字符串,c++,casting,typedef,case-sensitive,char-traits,C++,Casting,Typedef,Case Sensitive,Char Traits,我曾经为string创建不区分大小写的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; 我花了一些时间试图找出如何重载=操作符,并尝试使用静态强制转换和动态强制转换

我曾经为string创建不区分大小写的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;

我花了一些时间试图找出如何重载
=
操作符,并尝试使用
静态强制转换
动态强制转换
,但没有成功。我如何才能做到这一点?

您的两种类型不同,因此不能将构造函数与常规的
std::string
一起使用。但是您的字符串仍然能够复制C字符串,因此这应该可以工作:

std::string s{"a"};
ci_string cis{ s.data() }; // or s.c_str(), they are the same

std::string
ci_string
不相关的类型。为什么
static\u cast
dynamic\u cast
能够转换它们?记住:同一模板的两个不同实例化是不相关的类型,并且可能完全不兼容

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

只需编写一个简单的转换函数,利用
std::string
ci_string
都将其
value_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";
}
#包括
#包括
结构ci_char_traits:public std::char_traits{
静态布尔等式(char c1,char c2){返回toupper(c1)=toupper(c2);}
静态布尔ne(char c1,char c2){返回toupper(c1)!=toupper(c2);}
静态bool lt(char c1,char c2){返回toupper(c1)toupper(*s2))返回1;
++s1;++s2;
}
返回0;
}
静态常量字符*查找(常量字符*s,整数n,字符a){
而(n-->0&&toupper(*s)!=toupper(a)){
++s;
}
返回s;
}
};
typedef std::基本字符串ci\U字符串;
ci_字符串到ci_字符串(std::string const&src)
{
返回ci_字符串(src.begin(),src.end());
//或:
//返回ci_字符串(src.c_str());
}
int main()
{
std::字符串s{“a”};
自动ci=到ci字符串;

std::不能只阅读链接到的答案下面的注释-这两种字符串类型不兼容。这就是为什么您的版本都不能工作的原因