GCC 4.8.0이 출시되면 C ++ 14의 일부인 자동 반환 유형 공제를 지원하는 컴파일러가 있습니다. 를 사용하면 다음 -std=c++1y
과 같이 할 수 있습니다.
auto foo() { //deduced to be int
return 5;
}
내 질문은 :이 기능을 언제 사용해야합니까? 언제 그리고 언제 코드를 더 깨끗하게해야합니까?
시나리오 1
내가 생각할 수있는 첫 번째 시나리오는 가능할 때마다입니다. 이런 식으로 작성할 수있는 모든 기능이 있어야합니다. 이것의 문제점은 코드를 항상 더 읽기 쉽게 만들 수는 없다는 것입니다.
시나리오 2
다음 시나리오는 더 복잡한 반환 유형을 피하는 것입니다. 매우 가벼운 예로서 :
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
나는 그것이 실제로 문제가 될 것이라고는 생각하지 않지만, 반환 유형이 매개 변수에 명시 적으로 의존하는 것이 어떤 경우에는 더 명확 할 수 있다고 생각합니다.
시나리오 3
다음으로 중복을 방지하려면
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
C ++ 11에서는 때로는 return {5, 6, 7};
벡터 대신에 항상 작동 할 수는 있지만 항상 작동하지는 않으며 함수 헤더와 함수 본문 모두에서 유형을 지정해야합니다. 이는 순전히 중복이며, 자동 반환 유형 공제는 이러한 중복을 방지합니다.
시나리오 4
마지막으로 매우 간단한 함수 대신 사용할 수 있습니다.
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
그러나 때로는 정확한 유형을 알고 싶을 때 함수를 볼 수 있으며, 제공되지 않으면 코드의 다른 지점으로 이동해야합니다 pos_
.
결론
이러한 시나리오를 제시하면 실제로이 기능이 코드를 더 깨끗하게 만드는 데 유용한 상황은 무엇입니까? 여기서 언급하지 않은 시나리오는 어떻습니까? 나중에 물지 않도록이 기능을 사용하기 전에 어떤 예방 조치를 취해야합니까? 이 기능이 없으면 불가능한 새로운 기능이 있습니까?
여러 질문은 이에 대한 답을 찾는 관점을 찾는 데 도움을주기위한 것입니다.
->decltype(t+u)
자동 공제로 대체 하면 SFINAE가 사망한다고 언급하지 않는 것 같습니다 .