Boost를 사용하여 C ++ 14 스타일 자동 반환 유형을 달성하려면 어떻게해야합니까?
두 값을 더하는 함수가 있다고 가정합니다. 유형에 대해 아무것도 모르는 경우 기본적으로 함수를 두 번 작성해야합니다. 실제 반환 값에 한 번, 반환 유형 지정자로 다시 :
template <typename A, typename B>
auto Add(const A& a, const B& b) ->std::decay<decltype(a + b)>::type
{
return a + b;
}
작동하는 동안 읽기 어렵고 유지 관리가 어렵 기 때문에 바람직하지 않습니다.
C ++ 14에서는 반환 유형 지정자를 삭제할 수 있기 때문에 문제가되지 않습니다 (그래도 감쇄를할지는 모르겠습니다 ...). 지금은 C ++ 11을 사용하고 있습니다.
아직 표준에 포함되지 않은 C ++의 기능을 찾을 때마다 분명히 필요하지만 Boost 라이브러리 에는 일반적으로 솔루션이 있습니다. 문서를 검색했지만 도움이 될만한 내용을 찾지 못했습니다. BOOST_AUTO_RETURN
및 BOOST_TYPEOF_TPL
기능은 더 03 사용자 ++ C로 C ++ 11 기능을 제공하기위한 것으로 보인다.
기본적으로 내가 추구하는 것은 다음 기능을 수행하는 것입니다.
template <typename A, typename B>
auto Add(const A& a, const B& b)
{
return a + b; // Deduce return type from this, like C++14 would
}
내가 알지 못하는 (또는 C ++ 11의 멋진 트릭) Boost 라이브러리에 -> decltype(...)
모든 자동 반환 유형 후에 명시적인 것을 무시할 수있는 기능이 있습니까? 이것이 어떻게 구현 될까요?
C ++ 11에서 유일하게 가능한 추론 된 함수 반환 유형은 람다의 반환 유형입니다. 하지만 C ++ 11은 람다의 사용을 제한합니다. 이것은 작동합니다 :
auto add = [](int a, int b) { return a + b; };
이것은 유효하며 를 반환 add
하는 operator()
멤버 함수를 정의하는 람다로 정의 int
됩니다. 람다는 아무것도 캡처하지 않기 때문에 다음과 같이 작성할 수도 있습니다.
auto add = +[](int a, int b) { return a + b; };
add
함수에 대한 일반 포인터 를 만들려면 type을 얻습니다 int(*)(int, int)
.
그러나 C ++ 11에서는 매개 변수 유형을로 지정 auto
하거나 add
템플릿 변수로 정의 할 수 없으므로이를 사용하여 일반적으로 반환 유형을 추론 할 수 없습니다. 템플릿 클래스에서 래핑하려는 시도가 실패합니다.
template <typename A, typename B>
struct S { static auto add = [](A a, B b) { return a + b; }; }; // invalid
add
여기서 in-class 를 초기화하는 것은 유효하지 않으며 auto
멤버가 in-class로 초기화되지 않으면 사용할 수 없습니다 . 게다가, 그것은 일을했다하더라도, 그것은 공제 허용하지 않을 A
또는 B
필요하시면 더 많은 것 같다.
그 한계를 감안할 때, 나는 표현을 반복하는 것 외에는 대안이 보이지 않습니다. 하지만 사소한 매크로에서 반복을 숨길 수 있습니다.
#define AUTO_RETURN(func, ...) auto func -> decltype(__VA_ARGS__) { return __VA_ARGS__; }
template <typename A, typename B>
AUTO_RETURN(add(A a, B b), a + b)
또는 Marc Glisse가 지적한 변형은
#define RETURNS(...) noexcept(noexcept(__VA_ARGS__)) -> decltype(__VA_ARGS__) { return __VA_ARGS__; }
template <typename A, typename B>
auto add(A a, B b) RETURNS(a + b)
좀 더 깔끔해 보입니다.
이미 Boost에 이와 같은 것이있을 수 있습니다. 그럼에도 불구하고 사소함을 감안할 때 Boost는 여기에서 과도하게 보입니다.
이 구문을 에뮬레이트 하는 라이브러리 Pythy 가 있습니다. 그러나 clang에서만 작동합니다. 여기 와 여기 에 이러한 버그로 인해 gcc에서 작동하지 않습니다 . gcc 4.9에서 수정 될 수 있지만 gcc 4.9를 사용하는 경우 자동 반환 유형을 사용할 수 있습니다.
'code' 카테고리의 다른 글
하위 프로세스를 사용할 때 Python에서 티 동작을 복제하는 방법은 무엇입니까? (0) | 2020.12.02 |
---|---|
range (len (a))가 필요합니까? (0) | 2020.12.02 |
Chrome 프로파일 러의 '최적화되지 않음'경고는 무엇을 의미하나요? (0) | 2020.12.02 |
사용자가 로그인 한 후 Laravel 5 세션이 지속되지 않음 (0) | 2020.12.02 |
모든 Android 기기를 지원하려면 14 가지 레이아웃이 필요합니까? (0) | 2020.12.02 |