C++/Effective Modern C++
[Effective Modern C++] 항목 33. std::forward를 통해서 전달할 auto&& 매개변수에는 decltype을 사용하라
pppgod
2020. 1. 18. 17:35
람다 함수와 함께 auto 를 사용하는 것은 매우 고무적인 일이다. 다음과 같이 말이다.
auto f = [](auto x) { return normalize(x); };
이 람다 함수는 컴파일러에 의해 다음과 같은 클로저 클래스가 생성된다.
class 컴파일러가_생성한_클래스 {
public:
template<typename T>
auto operator()(T x) const
{ return normalize(x); }
...
};
이제 문제가 생기는 것은 x 를 normalize 에 완벽 전달을 하고 싶어지면 어떻게 해야할까?
auto f = [](auto&& x)
{ return normalize(std::forward<???>(x)); };
???에 적어야할 타입은 무엇일까? 우리는 항목3에서 배운 decltype 을 사용하면 된다.
[Effective Modern C++] 항목 3. decltype의 작동 방식을 숙지하라
decltype 이라는 키워드는 객체가 주어졌을때, 그 객체의 타입을 알려준다. 예시를 보자. const int i = 0; // decltype(i)는 const int MyClass object; // decltype(object)는 MyClass 위와 같이 객체의 타입을..
pppgod.tistory.com
다음과 같이 사용하면 된다.
auto f = [](auto&& x)
{
return
normalize(std::forward<decltype(x)>(x));
};
참고 서적
스콧 마이어스, Effective Modern C++