функция с шаблонами и надстройкой - PullRequest
1 голос
/ 17 декабря 2011

Я пытаюсь написать функтор для вызова функции повышения с помощью bind и некоторого шаблона. Итак, у меня есть это основное:

int     function(char c)
{
   std::cout << c << std::endl;
   return (0);
}

int main()
{
    Function<int (char)> fb = boost::bind(&function, _1);
    fb('c');
    return (0);
}

и это мой класс Function:

template<typename F>
class Function
{
private:
    F       functor;

public:
    Function()
    {
        this->functor = NULL;
    };

    Function(F func)
    {
        this->functor = func;
    };

    template <typename P>
    void    operator()(P arg)
    {
        (*this->functor)(arg);
    };

    void    operator=(F func)
    {
        this->functor = func;
    };
};

У меня проблема: когда я пытаюсь скомпилировать, у меня появляются следующие ошибки:

error C2440: 'initializing' : cannot convert from 'boost::_bi::bind_t<R,F,L>' to 'Function<F>'
IntelliSense: no suitable user-defined conversion from "boost::_bi::bind_t<int, int (*)(char), boost::_bi::list1<boost::arg<1>>>" to "Function<int (char)>" exists  

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

1 Ответ

0 голосов
/ 17 декабря 2011

boost::bind вернет что-то неуказанное, но конвертируемое в boost::function. У вас нет причин иметь свой собственный function класс.

Посмотрите на этот простой пример:

#include <boost/bind.hpp>
#include <boost/function.hpp>

int func(char) { return 23; }

int main()
{
  boost::function<int(char)> bound = boost::bind(func, _1);
  return 0;
}

Что означает unspecified тип возвращаемого значения для вашего случая? Вам нужно стереть тип Function и нужно написать что-то под названием AnyFunction. Зачем? Потому что вы никогда не сможете прописать тип аргумента шаблона Function в C ++ 03 (и даже C ++ 11, например, для принятия только определенного типа в качестве аргумента функции).

...