Сообщение Re[8]: std::function, could not deduce template argument от 14.02.2015 17:30
Изменено 14.02.2015 17:35 c-smile
Здравствуйте, 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)
И есть набор vfunc определений — конвертируют std::function в value-function
Это работает в принципе.
Но не для лямбд. Это вот не компилируется:
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; } );
Re[8]: std::function, could not deduce template argument
Здравствуйте, 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)
И есть набор vfunc определений — конвертируют std::function в value-function
Это работает в принципе.
Но не для лямбд. Это вот не компилируется:
А это вот работает:
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 );