Page 28 -
P. 28

template <typename T,  typename ... Args>
                   T createT(Args&&...args){
                   return T(std::forward<Args>(args)...);
                 }

                 int main(){
                   int a= createT<int>();
                   int b= createT<int>(1);

                   std::string s= createT<std::string>("Only for testing purpose.");


                   MyData myData= createT<MyData>();
                   MyData myData2= createT<MyData>(1, 3.19, 'a');


                   typedef std::vector<int> IntVec;
                   IntVec intVec = createT<IntVec>(std::initializer_list<int>({1, 2, 3, 4, 5}));
                 }


                                                                                6
               함수 템플릿인 createT는 인수를 보편 참조 형식인 ‘Arg&&...args’로 받아야 한다.  보편 참조
               (universal reference)란 타입 추론에서 우측값 참조인 것을 말하며, 전달 참조(forwarding reference)
               라고도 부른다.


                 Tip    std::forward를 가변 인수 템플릿과 조합하면 완벽한 제네릭 함수를 만들 수 있다

                 std::forward와 가변 인수 템플릿(variadic template)을 조합하면 완벽한 제네릭 함수 템플릿을 정의할 수 있다.
                 함수 템플릿은 임의의 개수의 인수를 받아서 그대로 포워드한다.





               2.1.4 std::swap

                                      7
               <utility>에 정의된 std::swap  함수를 이용하면 두 오브젝트를 맞바꾸는 작업을 쉽게 처리할 수
               있다. C++ 표준 라이브러리에서는 제네릭을 구현하는 데 내부적으로 std::move 함수를 활용하고
               있다.








               6  https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
               7  http://en.cppreference.com/w/cpp/algorithm/swap

         44





     c++_06.indd   44                                                                        2021-11-19   오전 9:25:45
   23   24   25   26   27   28   29   30   31