Подтвердить что ты не робот

Какова цель std:: char_traits:: assign()?

void assign(char_type& to, char_type from);

Почему вы не можете использовать оператор присваивания вместо этой функции? Для чего это используется?

4b9b3361

Ответ 1

Фактически вы используете эту функцию каждый раз, когда используете std::string:). std::string на самом деле является typedef для std:: basic_string, который определяется как:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT>
> class basic_string;

(см. this). Обратите особое внимание на параметр шаблона. Если вы были так склонны, параметр шаблона шаблонов позволяет настраивать определенные атрибуты поведения класса строки. Одним из таких свойств является то, что происходит при выполнении задания.

Вот пример использования этого. Это заставит присваивания быть строчными.

#include <string>
#include <iostream>
#include <cctype>

struct ci_char_traits : public std::char_traits<char> {
    static void assign(char& r, const char& a)
    {
        r = std::tolower(a);
    }

    static char* assign(char* p, std::size_t count, char a)
    {
        for (std::size_t i = 0; i < count; ++i)
        {
            p[i] = std::tolower(a);
        }
    }
};

typedef std::basic_string<char, ci_char_traits> ci_string;

std::ostream& operator<<(std::ostream& os, const ci_string& str) {
    return os.write(str.data(), str.size());
}

int main()
{
    ci_string s1 = "Hello";

    // This will become a lower-case 'o'
    s1.push_back('O');

    // Will replace 'He' with lower-case 'a'
    s1.replace(s1.begin(), s1.begin()+2, 1, 'A');

    std::cout << s1 << std::endl;
}

Ответ 2

Это связано с тем, что черты характера - это способ создания вариантов стандартных классов (например, строк), и оператор примитивного типа может быть не таким, каким вы хотите.

Например, рассмотрим класс, в котором хранятся строки без учета регистра; вы можете реализовать assign() таким образом, чтобы хранить одну и ту же вещь как для большой буквы, так и для ее строчной версии. (В этом отношении другие операции с характерными чертами, такие как равенство, также должны быть переопределены.)