code

Boost를 사용하여 C ++ 14 스타일 자동 반환 유형을 달성하려면 어떻게해야합니까?

codestyles 2020. 12. 2. 21:23
반응형

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_RETURNBOOST_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를 사용하는 경우 자동 반환 유형을 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/25321237/how-can-boost-be-used-to-achieve-c14-style-auto-return-types

반응형