Я писал несколько шаблонов, которые ожидают, что они будут переданы boost :: function.Они определяют аргументы для boost :: function, а затем используют их для создания соответствующей специализации класса.Например, это шаблон для 0 аргументов:
template< class ReturnT >
MyFunctionPtr MakeFunction( boost::function< ReturnT ( ) > func )
{
return MyFunctionPtr( new MyFunction< decltype( func ), ReturnT >( func ) );
}
В качестве ярлыка я получил другую версию шаблона MakeFunction, которая принимает указатель на функцию и автоматически оборачивает его в повышение:: функция соответствующего типа:
template< class T >
MyFunctionPtr MakeFunctionFromPointer( T func )
{
return MakeFunction(
boost::function< typename boost::remove_pointer<T>::type >( func )
);
}
Это позволяет мне создавать из указателей функций без явной передачи спецификации функции:
int something() { return 1; }
MakeFunctionFromPointer( &something );
В MSVC это работает нормально, но с GCC4.3 Я получаю ошибки "нет подходящей функции".Похоже, что:
На MSVC boost::remove_pointer< bool (*)() >::type
это bool ()
Но на GCC 4.3: boost::remove_pointer< bool (*)() >::type
это bool ()()
Так что на GCC соответствующий шаблонMakeFunction не существует.
Можно ли каким-либо образом изменить выходные данные на выходе remove_pointer на любой платформе, чтобы они соответствовали другой?Или есть другой способ решить эту проблему?