Considérons le code suivant, inspiré de la réponse de Barry à la question suivante ce question :
// Include
#include <tuple>
#include <utility>
#include <iostream>
#include <type_traits>
// Generic overload rank
template <std::size_t N>
struct overload_rank
: overload_rank<N - 1>
{
};
// Default overload rank
template <>
struct overload_rank<0>
{
};
// Prepend argument to function
template <std::size_t N, class F>
auto prepend_overload_rank(F&& f) {
using rank = overload_rank<N>;
return [f = std::forward<F>(f)](rank, auto&&... args) -> decltype(auto) {
return std::forward<F>(f)(std::forward<decltype(args)>(args)...); // here
};
}
// Main
int main(int argc, char* argv[])
{
auto f = [](int i){return i;};
prepend_overload_rank<5>(f)(overload_rank<5>(), 1);
return 0;
}
Il ne compile pas à cause de la ligne notée here
et je ne comprends pas pourquoi :
With g++:
error: no matching function for call to 'forward<main(int, char**)::<lambda(int)>&>(const main(int, char**)::<lambda(int)>&)'
With clang:
error: no matching function for call to 'forward'
Remplacement de
return std::forward<F>(f)(std::forward<decltype(args)>(args)...);
par
return f(std::forward<decltype(args)>(args)...);
fait apparemment fonctionner le système, mais encore une fois, je ne comprends pas pourquoi, et mon objectif est de parvenir à une redirection parfaite de la fonction.