ÇÁ·Î±×·¡¹Ö
ù ÆäÀÌÁö ·£´ý ±Û ȸ¿ø°¡ÀÔ ·Î±×ÀÎ
ºñ°ø°³ ¼Õ´Ô ¡¦ 2018-02-09 20:44:37
URL https://te31.com/rgr/view.php?id=study&no=2532 ¸ð¹ÙÀÏ È­¸é
C++) rvalue ref¿Í »ý¼ºÀÚ È£Ãâ

ƯÁ¤ Ŭ·¡½º ³»ºÎ º¯¼ö¿¡ std::function ¿ÀºêÁ§Æ®¸¦ ÀúÀåÇÏ°íÀÚ ´ÙÀ½°ú °°ÀÌ »ý¼ºÀÚ¸¦ ¸¸µé¾ú½À´Ï´Ù.

std::function<void()> task; //function object¸¦ ÀúÀåÇÒ º¯¼ö

template <class func, class... args> //... (1)
Task(func&& f, args&&... a) : task(std::bind(std::forward<func>(f), std::forward<args>(a)...)  // ÀÎÀÚ¸¦ bindÇؼ­ task¿¡ ³ÖÀ½.
{}

±×¸®°í ÀÌ Å¬·¡½ºÀÇ º¹»ç »ý¼ºÀÚ¸¦ ´ÙÀ½°ú °°ÀÌ ¸¸µé¾ú½À´Ï´Ù.

Task(const Task& other) : task(other.task) {} //... (2)

ÀÌ·¸°Ô º¹»ç»ý¼ºÀÚ¸¦ ¿À¹ö·Îµå ÇÒ °æ¿ì ´ÙÀ½°ú °°Àº °æ¿ì¿¡ ¹®Á¦°¡ ¹ß»ýÇÕ´Ï´Ù.

Task task([](){ std::cout << "Hello, world!" << std::endl; }); //°£´ÜÇÑ Task »ý¼º
Task other = task; //º¹»ç »ý¼ºÀÚ È£Ãâ!

Á¦°¡ ÀǵµÇÑ ÇÔ¼ö È£ÃâÀº º¹»ç»ý¼ºÀÚ(2) È£ÃâÀÔ´Ï´Ù. ±×·±µ¥ À̳ðÀº »ý°¢Áöµµ ¸øÇÏ°Ô (1)À» È£ÃâÇÏ°Ô µË´Ï´Ù.

ÀÌ°Ô ¿Ö (1)À» È£ÃâÇÏ°Ô µÇ´ÂÁö ±Ã±ÝÇÕ´Ï´Ù.

¶ÇÇÑ ÀÌ°É (2)¸¦ È£ÃâÇÏ°Ô ¸¸µé ¹æ¹ýÀÌ ¾ø´ÂÁö ±Ã±ÝÇÕ´Ï´Ù.

Áú¹® | 1398¸íÀÌ Àоú¾î¿ä. 44.212.26.248

0
1 ºñ°ø°³ ¼Õ´Ô ¡¦ 2018-02-10 13:27:03
template parameter¸¸À¸·Î µÈ ÇÔ¼ö¸¦ ¿À¹ö·Îµå ÇÒ¶§´Â enable_if¸¦ ÀÌ¿ëÇؼ­ ÇÊÅ͸µ ÇÏ´Â°Ô °ÅÀÇ À¯ÀÏÇÑ ¹æ¹ýÀÔ´Ï´Ù.

template <class Ty>
using is_self = std::is_same<Task, typename std::remove_const<typename std::remove_reference<Ty>::type>::type>;

template <class func, class... args, class = std::enable_if<!is_self<func>::value>::type>
Task(func&& f, args&&... a)
2 ºñ°ø°³ ¼Õ´Ô ¡¦ 2018-02-10 14:24:10
ÅÛÇø´À¸·Î Â¥¿©Áø Äڵ带 ÄÄÆÄÀÏ ÇÏ´Â °úÁ¤¿¡¼­ ±âº»ÀûÀ¸·Î °°Àº ½Ã±×´ÏÃĸ¦ °¡Áø ´Ù¸¥ ÇÔ¼ö°¡ À־ ¹«½ÃÇÏ°í ÅÛÇø´ ÇÔ¼ö·Î ¿¬°áÇÏ°Ô µÇ´Â°Ç°¡¿ä??
3 ºñ°ø°³ ¼Õ´Ô ¡¦ 2018-02-10 16:25:38
¿À¹ö·Îµù µÈ ÇÔ¼ö¸¦ È£Ãâ ÇÒ ¶§ ŸÀÔ ¸ÅĪ¿¡ µû¸¥ ¹®Á¦ÀÔ´Ï´Ù.

Task other = task; ±¸¹®À» ÄÄÆÄÀÏ ÇÒ ¶§, task°¡ const°¡ ¾Æ´Ï±â ¶§¹®¿¡ ¸ÅĪ ½ÃµµÇÏ´Â »ý¼ºÀÚ´Â Task(Task &task) »ý¼ºÀÚ°¡ µË´Ï´Ù.
ÇÏÁö¸¸ ÇØ´ç »ý¼ºÀÚ°¡ ¾øÀ¸¹Ç·Î ´ÙÀ½ »ý¼ºÀÚ¸¦ ¼±ÅÃÇÏ°Ô µÇ´Âµ¥, »ý¼ºÀÚ 2°¡ l-value to r-value conversionÀ̶ó¼­, const& conversionÀÎ »ý¼ºÀÚ 1º¸´Ù ¿ì¼±µÇ°Ô µË´Ï´Ù.
Task other = const_cast<const Task&>task; ±¸¹®À» ÄÄÆÄÀÏ Çغ¸¸é, »ý¼ºÀÚ 1À» ¸ÅĪÇÏ°Ô µÇ´Â °ÍÀ¸·Î È®ÀÎ °¡´ÉÇÕ´Ï´Ù.

µû¶ó¼­ ÇØ°á¹ýÀº Å©°Ô µÎ °¡Áö°¡ µË´Ï´Ù.
1. Á¤È®ÀÎ ¸ÅÄ¡µÇ´Â »ý¼ºÀÚ¸¦ ¸¸µé¾î ÁÖ´Â °Í.
ÇÏÁö¸¸ const Task&¿Í Task& »ý¼ºÀÚ¸¦ °°ÀÌ ¼±¾ðÇÏ¸é ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯°¡ °æ°í°¡ ³ª¿Ã°Ì´Ï´Ù.
2. std::enable_if¸¦ ÀÌ¿ëÇÏ¿© template parameter matchingÀ» Á¦¾àÇÏ´Â ¹æ¹ý.
4 ºñ°ø°³ ¼Õ´Ô ¡¦ 2018-02-10 17:25:09
°¨»çÇÕ´Ï´Ù. ±ò²ûÈ÷ ÀÌÇØ°¡ µÇ³×¿ä
´ñ±ÛÀ» ÀÛ¼ºÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.
(±ÇÇÑÀÌ ¾ø´Â ȸ¿ø·¹º§)
¸ñ·ÏÀ¸·Î
ÀÌ¿ë¾à°ü | ±¤°í/Á¦ÈÞ | °³ÀÎÁ¤º¸Ãë±Þ¹æħ | ¹®ÀÇ/½Å°í | ¸ð¹ÙÀÏ TE31 | ¼­¹ö ºÎÇÏ : 23.25%
½Ç½Ã°£ Issue Ä¿¹Â´ÏƼ TE31 [¾ËÁö·Õ] ¨Ï 2002-2024
TOP arrow_upward