gpt4 book ai didi

c++ - 是否可以使 std::string 始终包含小写字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:23 24 4
gpt4 key购买 nike

是否可以使 std::string 始终包含小写字符串?下面是我将如何使用它:

typedef std::basic_string<...> lowercase_string;

void myfunc()
{
lowercase_string s = "Hello World"; // notice mixed case
printf(s.c_str()); // prints "hello world" in lowercase
std::string s2 = s;
printf(s2.c_str()); // prints "hello world" in lowercase
}

最佳答案

您可以编写自己的字符特征并将其作为第二个模板参数传递给 std::basic_string

这是一个最小示例:

template<typename T>
struct lowercase_char_traits : std::char_traits<T>
{
static T* copy(T* dest, const T* src, std::size_t count )
{
for(size_t i = 0 ; i < count ; ++i)
dest[i] = std::tolower(src[i]);
return dest;
}
static void assign(T & out, T in)
{
out = std::tolower(in);
}
//implement other overload of assign yourself

//note that you may have to implement other functionality
//depending on your requirement
};

然后将 typedef 定义为:

typedef std::basic_string<char, lowercase_char_traits<char>> lowercase;

这是一个测试程序:

int main() 
{
lowercase s1 = "Hello World";
std::cout << s1.c_str() << std::endl;

lowercase s2 = "HELLO WORLD";
std::cout << std::boolalpha << (s1 == s2) << std::endl;

lowercase s3 = "HELLO";
s3 += " WorL";
s3.append("D");
std::cout << std::boolalpha << (s1 == s3) << std::endl;

std::cout << s2.c_str() << std::endl;
std::cout << s3.c_str() << std::endl;
}

输出:

hello world
true
true
hello world
hello world

很酷,不是吗?


请注意,要拥有一个完全可用的小写字符串类,您可能还需要定义 lowercase_char_traits 的其他功能,具体取决于您希望此类的行为.

有关详细信息和解释,请查看 Herb Sutter 的精彩文章:

希望对您有所帮助。

关于c++ - 是否可以使 std::string 始终包含小写字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14625416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com