Рассмотрим следующий код, который создает функции хранения класса.Совершенная пересылка функций для построения класса списка функций
// Function list class
template <class... F>
struct function_list
{
template <class... G>
constexpr function_list(G&&... g) noexcept
: _f{std::forward<G>(g)...}
{
}
std::tuple</* F... OR F&&... */> _f;
};
// Function list maker
template <class... F, class R = /* Can we compute the return type here? */>
constexpr R make_function_list(F&&... f)
{
return function_list<
/* decltype(std::forward<F>(f))...
* OR F...
* OR F&&...
*/>(std::forward<F>(f)...);
}
Я хотел бы эти функции должны быть идеально переадресованы (независимо от того, являются ли они указатели на функции, функторы, лямбда ...). Но я не совсем понимаю, какой тип дедукции происходит за std::forward
и универсальными ссылками. В приведенном выше коде, у меня есть три вопроса:
- Должен
_f
быть типаstd::tuple<F...>
илиstd::tuple<F&&...>
- Можно ли вывести тип
R
возврата в списке параметров шаблона (потому что это делать (и почему?) вручную вместоauto/decltype(auto)
было бы полезно, чтобы понять, что происходит) - в мейкера, что
function_list
аргумент шаблона должен быть:decltype(std::forward<F>(f)...)
,F
илиF&&...
(и почему)
Примечание: конструктор function_list
не должен вызываться напрямую, вместо этого make_function_list
выполняет свою работу.
EDIT: В этом случае сейф, если operator()
из function_list
(не показан) не может быть вызван в том же заявлении?
template <class... F>
constexpr function_list<F...> make_function_list(F&&... f)
{
return function_list<F&&...>(std::forward<F>(f)...);
}
Вы почти наверняка ** не ** хочу им быть 'F &&'. – SergeyA
1) 'tuple' 2) Вам не понадобится 'R' в списке шаблонов, вы уже знаете, что тип возвращаемого значения -' function_list '3)' F && ', потому что это ссылка пересылки, которая связывает оба с rvalue и lvalue refs (вы сказали, что хотите совершенную пересылку, так вот как вы ее получите) –
AndyG
, если вы можете гарантировать, что оператор вызова функции вызывается в том же самом выражении, что и 'make_function_list', вы можете использовать' F && '(вы можете выражаем, что с использованием ref refifier '&&', на 'operator()') –