29 Ocak 2018 Pazartesi

String Literal s

Giriş
C++14 ile geliyor. Literal'i std::string'e çevirir. Şu satırı dahil ederiz.
using namespace std::string_literals;
Açıklaması şöyle.
It is a well-known annoyance that string literals better convert to bool than to std::string
Niçin lazım
Eski kodlardaki string literal std::string'e dönüştürülmeyebilir. Elimizde şöyle bir kod olsun
#include <iostream>
#include <string>

void f(std::string) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
void f(std::string const&) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
void f(bool) { std::cout << __PRETTY_FUNCTION__ << '\n'; }

int main() {
    f("hello");
}
Çıktı olarak şunu alırız.
void f(bool)
İmzası
İmzası şöyledir.
string operator "" s(const char* str, size_t len);
C++14 yoksa kendimiz şöyle yapabiliriz.
std::string operator""_s (const char* cs, size_t)
{
    return std::string(cs);
}
Null Karakter Ekleme
string literal'ın en önemli faydalarından birisi null karakter eklemeyi kolaylaştırması

Örnek
Elimizde şöyle bir kod olsun.
std::string str = "foo\0bar";
Bu durumda std::string sınıfının const char* alan constructor metodu çağrılır. Ancak bu constructor sadece null karakterine kadar olan kısmı alır. String Literal içinde \0 karakterini kullanmak için şöyle yaparız.
std::string s = "foo\0bar"s; // s contains a \0 in its middle.
std::string s2 = "foo\0bar"; // equivalent to "foo"s
Örnek
Elimizde şöyle bir kod olsun.
int main()
{
    using namespace std::string_literals;

    std::string s1 = "abc\0\0def";
    std::string s2 = "abc\0\0def"s;
    std::cout << "s1: " << s1.size() << " \"" << s1 << "\"\n";
    std::cout << "s2: " << s2.size() << " \"" << s2 << "\"\n";
}
Çıktı olarak şunu alırız.
s1: 3 "abc"
s2: 8 "abc^@^@def"

Diğer
Örnek
Elimizde bir variant olsun.
std::map<std::string, boost::variant<int, std::string, bool> > values;
Bu variant'a std::string değer atamak için şöyle yaparız.
using namespace std::string_literals;
values["b"] = "foo"s;
Örnek
Şöyle yaparız.
using namespace std::string_literals;
std::cout << "3"s + "4"s;
Örnek
s string literal encoding ön ekleri ile kullanılabilir. Şöyle yaparız.
std::string s = "hello world"s;
std::u16string s16 = u"hello world"s;
std::u32string s32 = U"hello world"s;
std::wstring ws = L"hello world"s;

Hiç yorum yok:

Yorum Gönder