boost :: function функция указатель на параметры? - PullRequest
2 голосов
/ 13 июня 2010

Как boost :: function берет указатель на функцию и получает из нее параметры? Я хочу обернуть указатель на функцию, чтобы его можно было проверить перед вызовом. И было бы неплохо иметь возможность вызывать его, как boost :: function с оператором () и не имея доступа к члену указателя функции.

    Wrapper func;
    func(5); //Yes :D
    func.Ptr(5) //Easy to do, but not as nice looking

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Вам нужно перегрузить operator(). Чтобы определить тип возврата, арность и типы параметров функции, вы можете использовать что-то вроде Boost.TypeTraits:

#include <boost/type_traits.hpp>

template <typename Function>
struct Wrapper
{
    typedef typename boost::function_traits<Function>::arg1_type Arg1T;
    typedef typename boost::function_traits<Function>::result_type ReturnT;

    Wrapper(Function func) : func_(func) { }

    ReturnT operator()(Arg1T arg) { return func_(arg); }

    Function* func_;
};

bool Test(int x) { return x < 42; }

int main()
{
    Wrapper<bool(int)> CallsTest(&Test);
    CallsTest(42);
}
0 голосов
/ 13 июня 2010

Как-то так?

class Functor
{
public:

    /// type of pointer to function taking string and int and returning int
    typedef int ( *func_ptr_t )( const std::string&, int );

    explicit Functor( func_ptr_t f ) : fptr_( f ) {}

    int operator()( const std::string& s, int i ) const { return fptr_( s, i ); }

private:

    func_ptr_t fptr_; //< function pointer
};

Но почему бы просто не использовать boost::function?Это позволяет намного больше, чем просто указатель на функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...