25 Kasım 2016 Cuma

std::comp_ellint_3

Giriş
Bu metodun ne işe yaradığını anlamadım. std::ellint_3 ile bağlantılı

Şöyle yaparız.
auto k  = 0.0;

auto nu = -0.9;

auto expected = std::comp_ellint_3(k, nu);

std::ellint_3

Giriş
Bu metodun ne işe yaradığını anlamadım. std::comp_ellint_3 ile bağlantılı

Şöyle yaparız.
const auto pi = std::acos(-1.0);
const auto k  = 0.0;
auto nu : -0.9;

auto expected = std::ellint_3 (k, nu, pi/2);

21 Kasım 2016 Pazartesi

Variadic Template C++14

for döngüsü kullanımı
Şöyle yaparız.
for (const auto& array : { args... })
Örnek 1
Sayıların çarpımını almak için şöyle yaparız.
// outside the class
template<size_t... Ns>
constexpr size_t product(){
  size_t p = 1;
  for(auto n : { Ns... }) p *= n;
  return p;
}

// then
std::array< float, product<N_i...>()> arr;
Örnek 2
std::array<..> kabul eden ve her indeksin ortalamasını alan bir metodum yazmak istersek şöyle yaparız
template<typename T, std::size_t N, typename... Ts>
std::array<T, N> average (const Ts&... args)
{
  std::array<T, N> result;
  for (std::size_t i = 0; i < N; ++i)
  {
    T addedValues = 0;
    for (const auto& array : { args... })
      addedValues += array[i];

      result[i] = addedValues / sizeof...(args);
  }

  return result;
}
metod çağırma kullanımı
Açıklaması şöyle
I wrote a template that takes an istream& and a function and is supposed to extract all parameters for this function from the istream, call the function with these parameters and return the result.
Şöyle yaparız. Burada function Foo constructor ve parametre olarak int ve string alıyor. Dolayısıyla Parse metodu int ve string ile çağrılacak. Buradaki tek problem function çağrısında "order of evaluation" soldan sağa olmak zorunda değil. Derleyicisine göre değişebilir. Soldan sağa olmasını sağlamanın yöntemi yine linkte var.
#include <iostream>
#include <vector>

void Foo(int i, std::string s)
{
  std::cout << "input was " << i << " and " << s << '\n';
}

template<typename T>
T Parse(std::istream &s)
{
  T res;
    
  s >> res;
    
  return res;
}

template<typename TR, typename ... TArgs>
TR Bar(std::istream &s, TR f(TArgs...) )
{
  return f(Parse<TArgs>(s)...);
}

int main()
{
  Bar(std::cin, Foo);
}
Bu uygulamayı "1 2" girdisiyle çağırırız. Çıktı olarak şunu alırız
input was 2 and 1
sizeof kullanımı
Şöyle yaparız.
template<int N, typename... Ts>
constexpr bool number_of_args_divisible_by(Ts&&...)
{
  return sizeof...(Ts) % N == 0;
}

18 Kasım 2016 Cuma

std::tolower

Şöyle yaparız.
string str = "...";
for (int i = 0; i < str.length(); i++)
  str[i] = std::tolower( (unsigned char)str[i] );


17 Kasım 2016 Perşembe

std::rename

Giriş
Şöyle yaparız.
std::rename("abc.txt", "123.txt");

16 Kasım 2016 Çarşamba

std::remove

Giriş
Şu satırı dahil ederiz.
#include <cstdio>
Belirtilen dosyayı siler. Şöyle yaparız. Maalesef bu metod ile STL'deki std::remove() algoritması aynı isme sahipler.
std::remove("test.dat");

std::logic_error Exception Sınıfı

Giriş
std::logic_error mantıksal bir hata varsa atılır. Örneğin kullanıcı olmayan bir kayıdı silmeye çalışırsa atılabilir.

Constructor - Teklif
std::logic_error şu anda std::string ile yaratılıyor. Bu exception için const char alan constructor metodlar teklif edildi. Eğer kabul edilirse metod imzaları şöyle olacak.
std::logic_error::logic_error(const char* what_arg);
Kalıtım 
Şöyle yaparız.
class MyException : public std::logic_error {
  public:
    MyException (std::string const& msg) : std::logic_error(msg) { }
};
C++11 ile şöyle yaparız.
class MyException : public std::logic_error {
  public:
    using std::logic_error::logic_error;
};

12 Kasım 2016 Cumartesi

gcc extension - __builtin_unreachable

Giriş
Bu bir gcc extension. Derleyiciye bir değişkenin sadece belli bir aralıkta olacağını belirtmek için kullanılır.

Şöyle yaparız.
#define assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)

int func(int x){
  assume(x >=0 && x <= 10);

    if ( x > 11 ){
      return 2;
    }else{
      return 17;
    }
}
Böylece derleyiciye x'in [0-10] arasında olacağını bildiririz. Yani hep else kısmı çalışacaktır. Bu durumda şu kod üretilir.
func(int):
    mov     eax, 17
    ret