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