std::reference_wrapper::operator()
은 무엇 직접적인 함수 호출 것 이상으로 어떤 경우에는 "마법"의 비트를 수행합니다.
template <class... ArgTypes>
result_of_t<T&(ArgTypes&&...)>
operator()(ArgTypes&&... args) const;
반환 : 그것의 효과는 (N4296 [refwrap.invoke]를 인용)로 지정됩니다 INVOKE(get(), std::forward<ArgTypes>(args)...)
. (20.9.2)
get()
이 무엇
reference_wrapper
랩에 대한 참조를 반환
. INVOKE
는 20.9.2 [func.require]에 기술되어있다 : 다음
가 INVOKE(f, t1, t2, ..., tN)
을 정의
(1.1) - (t1.*f)(t2, ..., tN)
가 T
및 t1
는 클래스의 멤버 함수에 대한 포인터 f
이면 T
유형의 객체 또는 T
유형의 객체에 대한 참조 또는 T
에서 파생 된 유형의 객체에 대한 참조;
(1.2) - ((*t1).*f)(t2, ..., tN)
f
가 T
및 t1
이전에 기재된 유형의 하나가 아닌 클래스의 멤버 함수를 가리키는 포인터이고;
(1.3) - t1.*f
N == 1
및 f
가 T
및 t1
형 T
의 개체 또는 유형 T
의 목적 또는 유도 된 타입의 객체에 대한 참조에 대한 참조는 클래스의 멤버 데이터에 대한 포인터이며 T
에서;
(1.4) - (*t1).*f
N == 1
및 f
가 T
및 t1
이전에 기재된 유형의 하나가 아닌 클래스의 멤버 데이터에의 포인터 인 경우;
(1.5) - f(t1, t2, ..., tN)
다른 모든 경우에 해당합니다.
ref(f)
호출 대신에 단순히 f
결과
는 그 포인터 멤버 함수 부재 데이터가 가리키는 포인터 변수 같은 적절한 객체 포인터/참조하여 "호출"할 수있다. 예를 들어,
struct A { void foo(); };
struct B : A {};
struct C : B {};
for_each_arg(&A::foo, A{}, B{}, C{}, std::make_unique<A>());
는 A
, B
및 C
임시 개체에 foo
과 unique_ptr
(DEMO)에서 개최 된 개체를 호출합니다. 왜 이을 선호하는지 ref(f)
을 f
이상으로 사용하는 것은 명백하게 for_each_arg
을 사용하는 상황에 달려 있습니다.
필요하지 않습니다. https://twitter.com/ericniebler/status/559798611991879684 – inf