Для меня было бы естественным, если бы компилятор мог выводить типы шаблонов следующим образом:
template<typename R(typename... Args)>
struct wrap {
std::function<R(Args)> func_;
template<typename... Args2>
wrap(Args2&& ...args2) : func_(std::forward<Args2>(args2)...) {
}
R operator()(Args&&... args) {
cout << "Extra stuff that wrap template does" << endl;
return func_(std::forward<Args>(args)...);
}
}
Так что я могу создать экземпляр любой функции без явного указания ее подписи в шаблоне:
wrap w([](int x){ return 2*x });
И назовите это легко:
w(3);
Но оказывается, что этот вид упаковки не работает вообще. GCC 4.8.1 говорит expected nested-name-specifier before ‘R’
,
Почему это невозможно?
Каков был бы способ достижения такого рода универсальной функциональности упаковки?
Спасибо
Есть предложения сделать что-то подобное в C ++ 1y, состояние которого у меня не актуально.
Ваш синтаксис не подходит для этих предложений, поскольку лямбда-неверный тип для создания экземпляра std::function
шаблон с. Он хочет подпись, а не тип какой-то лямбды.
Написание make_wrap
возможно, но требует взять лямбда-тип и извлечь аргументы и вернуть значение самостоятельно. Это также редко хорошая идея, потому что если единственный способ узнать std::function
Тип s от дедукции, в этом контексте, почему тип стереть его? Вместо этого носите с собой сырой лямбда-тип.
Есть причины хотеть это сделать, но они редко бывают хорошими.
Других решений пока нет …