Skip to content

Latest commit

Β 

History

History
62 lines (45 loc) Β· 2.22 KB

File metadata and controls

62 lines (45 loc) Β· 2.22 KB

객체λ₯Ό ν΄λ‘œμ € μ•ˆμœΌλ‘œ μ΄λ™ν•˜λ €λ©΄ μ΄ˆκΈ°ν™” 갈무리λ₯Ό μ‚¬μš©ν•˜λΌ

ν΄λ‘œμ € μ•ˆμœΌλ‘œ 객체λ₯Ό 이동 μ‹œμΌœμ•Ό ν• λ•Œκ°€ μžˆλ‹€. 이동 μ „μš© 객체 ν˜Ήμ€ 볡사보닀 이동 μ„±λŠ₯이 더 쒋은 객체λ₯Ό ν΄λ‘œμ € μ•ˆμ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ΄λ‹€. ν•˜μ§€λ§Œ C++11 μ—μ„œλŠ” 이λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©° C++14μ—μ„œλŠ” μ΄ˆκΈ°ν™” 캑쳐λ₯Ό 톡해 κ°€λŠ₯ν•˜λ‹€. C++11μ—μ„œλŠ” νŽΈλ²•μ„ μ‚¬μš©ν•΄μ„œ 흉내 λ‚Ό 수 μžˆλ‹€.

c++14 μ΄ˆκΈ°ν™” 캑쳐

λžŒλ‹€λ‘œ λΆ€ν„° μƒμ„±λ˜λŠ” ν΄λ‘œμ € ν΄λž˜μŠ€μ— μ†ν•œ 자료 λ©€λ²„μ˜ 이름을 μ§€μ •ν•˜κ³  ν‘œν˜„μ‹μ„ 톡해 μ΄ˆκΈ°ν™” ν•  수 μžˆλ‹€.

class Widget {
  public:
    void test() {
      std::cout << "test call\n";
    }
};

int main() {

   auto pw = std::make_unique<Widget>();

   auto func = [pw = std::move(pw)]{
    return pw->test();
   };

   func();

  return 0;
}

μœ„ μ½”λ“œμ—μ„œ = 의 μ’Œλ³€μ€ ν΄λ‘œμ € 클래슀 μ•ˆμ˜ μžλ£Œλ©€λ²„ 이름이고, μš°λ³€μ€ 그것을 μ΄ˆκΈ°ν™” ν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€.

c++11 μ—μ„œ 이동 캑쳐λ₯Ό ν‰λ‚΄λ‚΄λŠ” 방법

λ°”μΈλ“œμ˜ μ—­ν™œμ€ 인자둜 λ„˜μ–΄μ˜¨ ν•¨μˆ˜μ™€ λ§€κ°œλ³€μˆ˜λ‘œ ν•¨μˆ˜κ°μ²΄λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.

λ°”μΈλ“œλŠ” ν•¨μˆ˜κ°μ²΄ 내에 λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ 객체λ₯Ό 포함할 λ•Œ μ™Όκ°’ λ§€κ°œλ³€μˆ˜λŠ” λ³΅μ‚¬λ˜κ³  였λ₯Έκ°’ λ§€κ°œλ³€μˆ˜λŠ” μ΄λ™λœλ‹€. 이 μ„±μ§ˆμ„ μ΄μš©ν•˜μ—¬ c++11 ν΄λ‘œμ €μ˜ ν•œκ³„λ₯Ό μš°νšŒν•œλ‹€.

λ°”μΈλ“œ ν•¨μˆ˜ 객체가 호좜되면 λ°”μΈλ“œμ— μ €μž₯된 λ§€κ°œλ³€μˆ˜λ“€μ΄ 첫 λ§€κ°œλ³€μˆ˜λ‘œ μ§€μ •λœ 객체에 μ „λ‹¬λœλ‹€.

class Widget {
  public:
    void test() {
      std::cout << "test call\n";
    }
};

int main() {

   auto func = std::bind([](std::unique_ptr<Widget>& pw){
        return pw->test();
       }, std::unique_ptr<Widget>(new Widget()));

   func();

  return 0;
}

이 μž₯을 κ³΅λΆ€ν•˜λ©΄μ„œ 의문이 λ“€μ—ˆλ˜ 것은 μ• μ΄ˆμ— λ§€κ°œλ³€μˆ˜λ₯Ό 받을 수 μžˆλŠ” λžŒλ‹€λ₯Ό μ •μ˜ν•˜λ©΄ 될것 같은데 λΌλŠ” 생각이 λ“€μ—ˆλ‹€.

쒀더 생각해 λ³΄λ‹ˆ std μ•ˆμ— λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” ν•¨μˆ˜κ°μ²΄λ₯Ό λ°›μ•„μ„œ λ‚΄λΆ€ λ‘œμ§μ— μ‚¬μš©ν•˜λŠ” 객체듀을 μ¨μ•Όν• λ•ŒλŠ” μœ„μ™€ 같은 기법이 ν•„μš”ν•  것 κ°™λ‹€.