11 Ocak 2018 Perşembe

std::to_string

Giriş
Bu metod bir template değil.std::to_wstring() ile kardeştir.

to_string - double
Bu sınıf aslında faydalı gibi görünse de noktadan sonra kaç hane istediğimizi belirtmemize müsade etmediği için çok iyi değil. Açıklaması şöyle
In C++11, std::to_string defaults to 6 decimal places when given an input value of type float or double.
Örnek
Şöyle yaparız
double d =  15.56;

string ss = to_string(d);  // Conversion to string
6 küsüratlı şu çıktıyı alırız.
15.56000000
Örnek
0 verirsek 6 küsuratlı şu çıktıyı alırız.
0.000000
-0 verirsek 6 küsüratlı şu çıktıyı alırız.
-0.000000
Örnek
Elimizde bir double olsun.
double d = 1e16;
Şöyle yaparız. Çıktı olarak 100000000000000000 alırız.
std::string str = std::to_string (d);
to_string - double için diğer seçenekler
1. stringstream
Örnek 
Eğer double değerini scientific olarak string'e çevirmek istersek şöyle yaparız.
double f= 1e16;
std::stringstream ss;
ss<<d<<".csv";
std::string filename = ss.str(); // filename = 1e+16.csv
Örnek - stringstream
Şöyle yaparız. Çıktı olarak 15.56 alırız
float myfloat = 15.56f;
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << myfloat;
std::string s = ss.str();
2. sprintf
Şöyle yaparız.
std::string mimicked(double v) {
  constexpr int prec = 6;

  std::string buf(prec+10, ' ');
  buf.resize(sprintf(&buf[0], "%.*g", prec, v));
  return buf;
}
to_string - uint32_t
Şöyle yaparız.
uint32_t num = 33;
std::string str = std::to_string(num);
to_string - nan ve infinity
Şu değelerler ile denersek
std::numeric_limits<double>::quiet_NaN()
std::numeric_limits<double>::infinity(),
-std::numeric_limits<double>::infinity(),
Şu çıktıyı alırız.
nan
inf
-inf
to_string - Kendi Sınıfım İçin Özelleştirmek
Şu şekilde yapabilirim ancak tavsiye edilmiyor.
namespace std {
  string to_string(::MyClass const & c) { return c.toString(); }
} // namespace std {

// Sample use-case:
int main() {
    MyClass c;
    std::cout << std::to_string(c) << std::endl;
}
Açıklamasında şöyle
It is undefined behavior to add declarations or definitions to namespace std or to any namespace nested within std, with a few exceptions noted below
It is allowed to add template specializations for any standard library template to the namespace std only if the declaration depends on a user-defined type and the specialization satisfies all requirements for the original template, except where such specializations are prohibited.
std isim alanına eklemeden şöyle yapabiliriz.
template<typename T> to_string(const T& _x) {
    return _x.toString();
}
Bu durumda Argument Dependent Lookup (ADL) yapmak için std::to_string() yerine to_string() şeklinde kullanmak gerekir.



Hiç yorum yok:

Yorum Gönder