error C2784: 'void f(std::function<void(T)>)' : could not deduce template argument for 'std::function<void(T)>' from 'main::<lambda_015bd0dc27990c8871eddd8030a68e56>' d:\tests\functional.cpp
Как бы исхитриться?
Ну или получить количество параметров std::function wrapper и их типы. Знаю как это сделать с пом. variadic templates, но на руках VS 2010, там этого нет.
Re: std::function, could not deduce template argument
Здравствуйте, c-smile, Вы писали:
CS>Как бы исхитриться? CS>Ну или получить количество параметров std::function wrapper и их типы. Знаю как это сделать с пом. variadic templates, но на руках VS 2010, там этого нет.
Ну если есть решение на вариадках, то несложно нагенерировать специализации.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, c-smile, Вы писали:
CS>>Как бы исхитриться? CS>>Ну или получить количество параметров std::function wrapper и их типы. Знаю как это сделать с пом. variadic templates, но на руках VS 2010, там этого нет.
_NN>Ну если есть решение на вариадках, то несложно нагенерировать специализации.
_NN>Вроде как decltype поддерживается в VS 2010.
А как decltype тут поможет?
Re: std::function, could not deduce template argument
Здравствуйте, andyp, Вы писали:
A>Если можешь прожить без auto, то так
A>
A>int main(int argc, char* argv[]) {
A> std::function<void(int)> func1 = [](int x) { std::cout << x << std::endl; };
A> std::function<void(int,int)> func2 = [](int x, int y) { std::cout << x << y << std::endl; };
A> f(func1);
A> f(func2);
A> return 0;
A>}
A>
В принципе это вариант, да.
Re: std::function, could not deduce template argument
Здравствуйте, c-smile, Вы писали:
CS>Ну или получить количество параметров std::function wrapper и их типы. Знаю как это сделать с пом. variadic templates, но на руках VS 2010, там этого нет.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, c-smile, Вы писали:
CS>>Ну или получить количество параметров std::function wrapper и их типы. Знаю как это сделать с пом. variadic templates, но на руках VS 2010, там этого нет.
J>Под решением с вариадиками ты имеешь в виду вот это? J>http://stackoverflow.com/a/7943765
Да, именно это.
Re[3]: std::function, could not deduce template argument
Здравствуйте, c-smile, Вы писали:
CS>Слышишь эхо комбинаторного взрыва? Нет? А он есть... CS>От 0 до 8-ми аргументов. Да по всем типам функций: member/free, const/non-const, throws/not-throws, volatile и не очень...
И что с того ? Простой скрипт все нагенерирует.
Коль нет вариадиков, хоть так извратиться.
Здравствуйте, c-smile, Вы писали:
_NN>>А в чем проблема сгенерировать необходимое количество специализаций вручную ?
CS>Слышишь эхо комбинаторного взрыва? Нет? А он есть... CS>От 0 до 8-ми аргументов. Да по всем типам функций: member/free, const/non-const, throws/not-throws, volatile и не очень...
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, c-smile, Вы писали:
CS>>Слышишь эхо комбинаторного взрыва? Нет? А он есть... CS>>От 0 до 8-ми аргументов. Да по всем типам функций: member/free, const/non-const, throws/not-throws, volatile и не очень...
_NN>И что с того ? Простой скрипт все нагенерирует. _NN>Коль нет вариадиков, хоть так извратиться.
2**7 = 128 деклараций ... да ну нафиг.
Лучше уж люди руками напишут
function<int(int,int)> sum = [](int a, int b) { return a + b; };
вместо модного
auto sum = [](int a, int b) { return a + b; };
Re[6]: std::function, could not deduce template argument
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, c-smile, Вы писали:
CS>>>Слышишь эхо комбинаторного взрыва? Нет? А он есть... CS>>>От 0 до 8-ми аргументов. Да по всем типам функций: member/free, const/non-const, throws/not-throws, volatile и не очень...
_NN>>И что с того ? Простой скрипт все нагенерирует. _NN>>Коль нет вариадиков, хоть так извратиться.
CS>2**7 = 128 деклараций ... да ну нафиг.
Скрипт то генерирует , не вручную же =)
CS>Лучше уж люди руками напишут
Ну все таки разница есть между лямбдой и std::function.
Да и auto хочется везде использовать как только привыкаешь к удобству
Здравствуйте, c-smile, Вы писали:
CS>void f(std::function<void(T)> g) CS> auto func1 = [](int x) { std::cout << x << std::endl; }; CS> f(func1);
такой код не будет работать ни в каком c++ даже без второго определения f, поскольку лямбда и std::function — разные типы, и автоматом привести к нужному типу сквозь темплейт не получится. во всяком случае в vc2013/gcc49
вот так работает:
void f(std::function<void(int)> g)
f(func1);
может, можно соорудить конвертор? типа такого:
template <typename T>
std::function<T> cvt(T &x) {return x;}
auto func1 = cvt([](int x) { std::cout << x << std::endl; });
Здравствуйте, PM, Вы писали:
PM>Здравствуйте, c-smile, Вы писали:
PM>>>Хотя, если доступен Boost, в нем кажется есть похожее: http://www.boost.org/doc/libs/1_57_0/libs/function_types/doc/html/index.html CS>>Это для одного из headers моего SDK, требовать еще наличия boost совсем не comme il faut ни разу.
PM>Я бы отказался от поддержки старых компиляторов и требовал С++11
Не могу пока.
PM>Еще по теме, а обязательно нужно стирание типов с std::function? Может быть удастся обойтись шаблонной f()
Есть такой тип (variant, discriminated union)
class value
{
public:
value( int i );
value( double f );
value( string s );
value( std::function<value(unsigned int argc, const value* argv)> func ); // value-function template<typename T> T get() const;
};
И есть набор vfunc определений — конвертируют std::function в value-function
// template<typename R,typename P0>
inline value vfunc( std::function<R(P0)> func )
{
return value([func](unsigned int argc, const value* argv) -> value {
R r = func(argc >= 1? argv[0].get<P0>(): P0() );
return value(r); });
}
template<typename R,typename P0,typename P1>
inline value vfunc( std::function<R(P0,P1)> func )
{
return value([func](unsigned int argc, const value* argv) -> value {
R r = func(argc >= 1? argv[0].get<P0>(): P0(),
argc >= 2? argv[1].get<P1>(): P1() );
return value(r); });
}
...
Это работает в принципе.
Но не для лямбд. Это вот не компилируется:
value local_func = vfunc( []{ int a, int b } { return a + b; } );
А это вот работает:
std::function<int(int,int)> t = []{ int a, int b } { return a + b; };
value local_func = vfunc( t );
Здравствуйте, Константин, Вы писали:
К>Здравствуйте, c-smile, Вы писали:
К>Какая-то пессимизация на пустом месте. Вместо функторов которые ещё и отлично инлайнятся, всё гонится через тяжёлый std::function. Зачем???
У c-smile там фреймворк с колбеками, так что, я думаю, это для хранения оных, и в этом смысле std::function подходит лучше всего.
(Еще лучше подошел бы Boost.Signal, но c-smile не хочет тащить буст, за исключением того, что уже попало в std)