std::reference_wrapper::operator()
ne doğrudan işlev çağrısı olur ötesinde bazı durumlarda "sihirli" bir parça gerçekleştirir.
template <class... ArgTypes>
result_of_t<T&(ArgTypes&&...)>
operator()(ArgTypes&&... args) const;
İade: Etkileri (N4296 [refwrap.invoke] alıntı) olarak belirtilir INVOKE(get(), std::forward<ArgTypes>(args)...)
. (20.9.2)
get()
Ne
reference_wrapper
saran bir başvuru verir
. INVOKE
20.9.2 [func.require] anlatılan aşağıdaki gibidir:
INVOKE(f, t1, t2, ..., tN)
tanımlayın:
(1.1) - (t1.*f)(t2, ..., tN)
T
ve t1
bir sınıfın bir elemanı işlevi için işaretçi f
edildiğinde T
türünün nesnesi veya T
tipindeki bir nesneye yapılan bir başvuru veya T
'dan türetilen bir nesneye yapılan bir başvuru;
(1,2) - ((*t1).*f)(t2, ..., tN)
f
T
ve t1
önceki maddede tarif edilen türde bir olmayan bir sınıfın bir üyesi fonksiyonuna işaret eder;
(1,3) - t1.*f
N == 1
ve f
T
ve t1
tip T
bir amacı ya da tip T
bir nesne ya da türetilmiş bir tipte bir nesne için bir başvuru için bir referans bir sınıf üyesi verilerine bir işaretçidir T
;
(1,4) - (*t1).*f
N == 1
ve f
T
ve t1
önceki maddede tarif edilen türde bir değil bir sınıf üyesi veri işaretçisi olduğunda; Diğer tüm durumlarda,
(1.5) - f(t1, t2, ..., tN)
.
ref(f)
aramak yerine sadece f
sonucu
olduğu işaretçi üyeli fonksiyon ve üye veri işaretçi-parametre olarak uygun bir nesne işaretçisi/referansla "olarak adlandırılan" olabilir. Örneğin,
struct A { void foo(); };
struct B : A {};
struct C : B {};
for_each_arg(&A::foo, A{}, B{}, C{}, std::make_unique<A>());
A
, B
ve C
geçici nesneleri foo
ve unique_ptr
(DEMO) tutulan bir nesne çağırır. Neden ,'u'u f
üzerinden kullanmayı tercih ederse, birinin for_each_arg
numaralı telefonu kullandığı bağlama bağlı olduğu açıktır.
Gereksiz. https://twitter.com/ericniebler/status/559798611991879684 – inf