7 Ağustos 2017 Pazartesi

std::tie

Giriş
std::tie ve std::tuple birbirlerinden ayrılmaz kavramlar. tie ile tuple içindeki parçalara erişimi kolaylaştırılır. Hatta kısmi bir görüntü elde edebiliriz.

Kullanım
Önce tie içinde kullanılacak değişkenler tanımlanır. Daha sonra Tie = Tuple şeklinde bağlama işlemi geçekleştirilir.

Örnek
Şöyle yaparız.
int a, b;
std::tie(a, b) = std::make_tuple(2, 3);
// a is now 2, b is now 3
Örnek
Şöyle yaparız.
std::tuple<int, bool, double> my_obj {1, false, 2.0};
// later on...
int x;
bool y;
double z;
std::tie(x, y, z) = my_obj;
// or, if we don't want all the contents:
std::tie(std::ignore, y, std::ignore) = my_obj;
std::tie ve const reference
f tuple dönen bir metod olsun. Şöyle yaparız.
const auto& [a, b] = f();
Bu kod şununla aynıdır.
const auto& e = f(); // 1
using E = remove_reference_t<decltype((e))>;
std::tuple_element<0, E>::type& a = get<0>(e);
std::tuple_element<1, E>::type& b = get<1>(e);
std::get ile kullanım
Eğer istenirse tie std::get ile de kullanılabilir ancak bu kullanımın bence hiç bir avantajı bulunmuyor.
#include <iostream>
#include <tuple>
#include <map>
using namespace std;

// an abstact object consisting of key-value pairs
struct thing
{
  std::map<std::string, std::string> kv;
};


int main()
{
  thing animal;
  animal.kv["species"] = "dog";
  animal.kv["sound"] = "woof";

  auto species = std::tie(animal.kv["species"], animal.kv["sound"]);

  std::cout << "The "<< std::get<0>(species)<<" says "<< std::get<1>(species);

  return 0;
}
std::tie ve eşitlik
std::tie eşitlik için kullanılabilir.
int a,b,c,d,e,f;
return std::tie(a,b,c,d,e,f) == std::tie(rhs.a,rhs.b,rhs.c,rhs.d,rhs.e,rhs.f); }
std::tie ve küçüktür
std::tie küçüktür karşılaştırması için kullanılabilir.
std::tie(a,b) < std::tie(rhs.a, rhs.b);
std::tie Allta Nasıl Çalışır
std::tuple şöyle bir operator sağlar
template< class... UTypes >
tuple& operator=( const tuple<UTypes...>& other );
Eğer şöyle bir kod yazarsak tuple içindeki değişkene referans alabiliriz.
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
std::tie bu kodu bizim için üretir.

C++17
C++17 structured binding sağlar. Bu yeni kullanım şekli ile std::tie kullanmaya gerek yok. Kullanım şekli için Structured Binding yazısına bakınız.

Hiç yorum yok:

Yorum Gönder