2017-10-07 1 views
1

는 다음과 같은 기능과 유사한 동작을이 함수를 저장 할 수 있나요 forwarding_func. 나중에 사용할 수 있도록 저장해야하므로 std :: function 객체가 필요합니까? 함수 객체에 이런 람다를 저장할 수도 있습니까? 당신이 당신의 인수가 좌변 참조인지 여부를 알 수없는이 경우로C++ 저장 기능

auto f = [](auto&& x){ 
     myfunction(std::forward<decltype(x)>(x)); 
} 
+0

예, 람다를 사용할 수 있습니다. 그것들을 저장하기를 원한다면'std :: function'이나 전달 된 람다 객체의 타입에 기반한 클래스를 사용할 수 있습니다. –

+1

std :: function 객체에 * not * 같은 것을 저장할 수 있습니다. –

+0

귀하의 예제 람다는 (작동한다면) 보편적 인 참조가 아니라 rvalue 참조를 취합니다. 그것은 단지 논증으로서 rvalues를 받아 들일 것이다. 나는 당신이 명시 적으로이 일을하는 법을 묻고 있음을 알고 있습니다, 그러나 저에게는 여전히 혼란이있는 것 같습니다. 유니버셜 및 레퍼런스 참조의 차이점에 대한 Scott Meyer의 기사 (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers)를 읽어 볼 수 있습니다. – Knoep

답변

2

당신은 함수 객체가 필요, 즉, operator()과 하나. 이 연산자는 템플릿이어야하며 forwarding_func과 같은 (또는 비슷한) 서명이 있어야합니다. 다양한 방법으로 하나를 만들 수 있습니다.

가장 직접적인 방법은 C++ 17 일반 람다를 사용하는 것입니다. 이를 사용할 수 없다면 자신을 정의 할 수 있습니다.

struct forwarder { 
    template <typename ... Args> 
     void operator()(Args&& ... args) { ... etc } 
}; 

전달자를 만드는 방법은 완전히 다릅니다. overload 기능을 표준 라이브러리에 추가 할 것을 제안합니다. (아직 표준의 일부가 아닌 것처럼

auto callable = std::overload (
    (void (*)(int, size_t))(target), 
    (void (*)(std::string, int))(target) 
); 

컴파일러는 표준 : 오버로드를 구현하지 않는,하지만 당신은 쉽게 직접 구현하거나 그물에 구현을 찾을 수 있습니다 :이처럼 사용합니다 예를 들어 this question 참조).

0

범용 참조 및 std::forward 만, 기능 템플릿에 의미를. 그럴 경우 그대로 전달하고, 그렇지 않은 경우 전달할 기능에 move을 입력하고 싶습니다. 그게 바로 std::foward입니다. Here은 rvalue-references와 완벽한 포워딩에 대한 아주 좋은 소개입니다. 템플릿이 아닌 함수는 인수를 값 또는 (lvalue-) 참조로 가져올 지 여부를 지정하므로 그에 따라 이동하거나 이동하지 않고 std::foward이 필요하지 않습니다.

함수 템플릿은 실제로 함수 자체가 아니므로 람다에 저장할 수 없습니다. 당신은 그러나 템플릿 operator()와 펑터를 만들 수 있습니다

struct Forwarding_Functor 
{ 
    template<class... T> 
    void operator()(T&&... args) 
    { 
     target(std::forward<T>(args)...); 
    } 
};