2016-04-28 33 views
9

W książce Scotta Meyera Effective Modern C++ on page 167 (w wersji drukowanej), daje następujący przykład:Cel perfekcyjnego przekazywania dla argumentu wywoływania w wyrażeniu wywołania?

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    std::forward<decltype(func)>(func)(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 

całkowicie rozumiem doskonałe przekazywanie params, ale nie jest jasne do mnie, gdy doskonałe przekazywanie func kiedykolwiek będzie istotnych. Innymi słowy, jakie są zalety powyższe na następujące:

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    func(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 
+5

Kiedy 'func' ma operatora zakwalifikowanego do wywołania funkcji. –

+0

Ohhhhhh .... ma sens. –

Odpowiedz

11

W tym samym celu, jak dla argumentów: więc kiedy Func::operator() jest ref kwalifikacjach:

struct Functor 
{ 
    void operator()() const & { std::cout << "lvalue functor\n"; } 
    void operator()() const && { std::cout << "rvalue functor\n"; } 
}; 

Demo

+4

Usuń część 'const', a następnie * lepiej * sens. – Nawaz

+0

nie, ponieważ "const" wartość rvalue reference woli 'const &' overload to '&&' overload: 'const Funktor f() {return Functor {}; }; f()(); '[przykład] (http://coliru.stacked-crooked.com/a/3e1b8f476f9e3f05) –