Türlərə təsir göstərən və konstruktor çağırışlarını köçürən / kopyalayan tuple aqreqat konstruksiyası?

Aşağıdakıları nəzərdən keçirin mypair sinfi (bunun ən yaxşı yolu olduğuna əmin deyiləm şeylər var, amma işləyir):

#include 

struct A
{
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
  A(A&&) { std::cout << "Move" << std::endl; }
  std::string s;
};

template 
struct mypair
{
  T0 x0;
  T1 x1;
};

template 
struct get_class {};

template
struct get_class
{
  static T0& get_func(mypair& x) { return x.x0; }
  static const T0& get_func(const mypair& x) { return x.x0; }
  static T0&& get_func(mypair&& x) { return std::move(x.x0); }
};

template
struct get_class
{
  static T1& get_func(mypair& x) { return x.x1; }
  static const T1& get_func(const mypair& x) { return x.x1; }
  static T1&& get_func(mypair&& x) { return std::move(x.x1); }
};

template 
auto get(mypair& x) -> decltype(get_class::get_func(x)) 
{ return get_class::get_func(x); }

#define MAKE_PAIR(x1, x2) mypair{x1, x2}

int main()
{
  auto x = MAKE_PAIR(A(), A());
  get<0>(x);
  get<1>(x);
}

(ideone link)

C ++ 11 'də məcmu başlanğıcın etibarlı olduğu zaman cavabı, məcmu başlatma edərək nüsxələri / hərəkətləri elide edə biləcəyimizi söyləyir.

Beləliklə, MAKE_PAIR istifadə edərək mpair s hər hansı bir hərəkət və ya nüsxə yerinə yetirməyə ehtiyac olmadan inşa edə bilərik.

Mən ümumiləşdirmək istəyirəm MAKE_PAIR - 1173592] MAKE_TUPLE , yəni istənilən sayda arqument götürün.

Tələblər ( MAKE_PAIR ilə olduğu kimi):

(1) Növlər haqqında nəticələr çıxarıldı.
(2) Müvəqqəti olaraq qurulduqda hərəkətlər / nüsxələr alınır (yəni tikinti yerində olur).

Mövcud kitabxana həlləri (məsələn, Boost) yaxşı olacaq, baxmayaraq ki mən dəyər istinadlarını qəbul edən bir şey istərdim. Və ya sadəcə buradakı kod da əladır, ya da ikisinin qarışığı.

Mümkünsə, hərəkətləri / kopyalayıcı konstruktor çağırışlarını davam etdirərkən boş üzvləri optimallaşdırsa istərdim, amma hiss edirəm çox soruşur.

6
задан Community 23 May 2017 в 10:00
поделиться