Информация об изменениях

Сообщение 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)

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)

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 );