Почему компилятор не может выводить типы из шаблонов, таких как шаблон & lt; typename R (typename … Args) & gt ;?

Для меня было бы естественным, если бы компилятор мог выводить типы шаблонов следующим образом:

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’,

Почему это невозможно?
Каков был бы способ достижения такого рода универсальной функциональности упаковки?

Спасибо

1

Решение

Есть предложения сделать что-то подобное в C ++ 1y, состояние которого у меня не актуально.

Ваш синтаксис не подходит для этих предложений, поскольку лямбда-неверный тип для создания экземпляра std::function шаблон с. Он хочет подпись, а не тип какой-то лямбды.

Написание make_wrap возможно, но требует взять лямбда-тип и извлечь аргументы и вернуть значение самостоятельно. Это также редко хорошая идея, потому что если единственный способ узнать std::functionТип s от дедукции, в этом контексте, почему тип стереть его? Вместо этого носите с собой сырой лямбда-тип.

Есть причины хотеть это сделать, но они редко бывают хорошими.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]