не удалось вычесть / замена шаблона - PullRequest
0 голосов
/ 18 ноября 2018

С помощью некоторых людей здесь я скомпилировал следующий код (добавив 'remove_reference'):

template< typename Fn >  
bool templateFunctionOne( Fn&& fn )
{
  int v = 5;
  return fn( v );
}

template < typename Fn >
bool templateFunctionTwo( Fn&& fn )
{
  std::future< bool > tk( std::async( std::launch::async,
                          &templateFunctionOne< typename std::remove_reference<Fn >::type >,
                          std::forward<Fn>(fn ) ) );
  return tk.get();
}

bool printThis( int value )
{
  cout << value << endl;
  return true;
}

int main()
{
   auto func = std::bind( &printThis, std::placeholders::_1 );
   return templateFunctionTwo( func );  
}  

Это хорошо компилируется. Теперь, если я оберну две функции шаблона в структуру и вызову ее из объекта класса наследования, он просто не будет работать:

struct TestParent
{
   template< typename Fn > bool templateFunctionOne( Fn&& fn )
   {
     int val = 5;
     return fn( val );
   }

   template< typename Fn > bool templateFunctionTwo( Fn&& fn )
   {
      std::future< bool > 
              tk ( std::launch::async,
                   &TestParent::templateFunctionOne< typename std::remove_reference<Fn>::type >,  
                   this, 
                   std::forward<Fn>( fn ) ) )  
      return tk.get();
   }
 };

struct TestChild: public TestParent
{
   bool printThis( int );
   bool test();
};

bool TestChild::printThis( int value )
{
  return true;
}

bool Testchild::test()
{
   auto func = std::bind( &TestChild::printThis, std::placeholders::_1, this);  
   return templateFunctionTwo( func );
}

int main()
{
   TestChild myTest;
   myTest.test();
   return 0;
}

Ошибки:

no matching for call to '(std::_Bind< bool ( TestChild::\*(std::_Placeholder<1>, TestChild*))(int) >) (int&)'   
     return fn( val )  
             ~~~~~~^~~~~~~  


functional:547:2: note: candidate: template< class ... _Args, class
_Result> _Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...)  [with _Arg = {_Args ...}; _Result =
_Result; _Functor = bool (TestChild::\*)(int); _Bound_args = {std::_Placeholder<1>, TestChild*}]    operator()( _Args&&... __args)  
^~~~~~~~

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 18 ноября 2018

this находится в неправильном месте во время привязки:

   auto func = std::bind( &TestChild::printThis, this, std::placeholders::_1);  
                                                 ^^^^

должен быть вторым аргументом.

Вторая проблема, вы не вызываете функцию async, вместо этого вы пытаетесь вызвать future ctor:

   std::future< bool > 
              tk ( std::launch::async,
                   &TestParent::templateFunctionOne< typename std::remove_reference<Fn>::type >,  
                   this, 
                   std::forward<Fn>( fn ) ) )  

должно быть:

 std::future< bool > 
          tk = std::async( std::launch::async,
               &TestParent::templateFunctionOne< typename std::remove_reference<Fn>::type >,  
               this,
               std::forward<Fn>( fn ) ) ;
...