freesyria
freesyria

Reputation: 1

calling functor using function Object tr1::function<>

I try to implement Scott Mayer book code example, the example is about calling functor through function object

the header file gameCharachter.h

#ifndef GAMECHARACTER_H
#define GAMECHARACTER_H

#include <iostream>
#include <typeinfo>
using namespace std;
#include <tr1/functional>

class GameCharacter;

int defaultHealthCalc(const GameCharacter& gc);

class GameCharacter
{

public:

    typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;

    explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : healthFunc(hcf)
    {
    }

    ~GameCharacter()
    {
    }

    int healthValue() const
    {
        return healthFunc(*this);
    }
private:

    HealthCalcFunc healthFunc;

};

class EyeCandyCharacter:   public GameCharacter    // another character
{

public:

    explicit EyeCandyCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : GameCharacter(hcf)
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;

    }                                           

};   

struct HealthCalculator                          
{
    /*explicit*/ HealthCalculator()
    {

    }

    int operator()(const GameCharacter& gc) const     // calculation function
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;
           return 0;
    }                                        

};

#endif // GAMECHARACTER_H

the main.cpp is :

#include "gamecharacter.h"

int main()
{
    EyeCandyCharacter ecc1(HealthCalculator());       
    ecc1.healthValue();
}

why function<> object refuse to call the operator() function in healthvalue()

Upvotes: 0

Views: 96

Answers (2)

freesyria
freesyria

Reputation: 1

this is the correct call , it should be called by bind

#include "gamecharacter.h"

int main()
{
    HealthCalculator hc;
    EyeCandyCharacter ecc1(std::tr1::bind(&HealthCalculator::operator(),hc,tr1::placeholders::_1));
    ecc1.healthValue();
}

Upvotes: 0

T.C.
T.C.

Reputation: 137301

EyeCandyCharacter ecc1(HealthCalculator());

declares a function called ecc1 that takes an argument of type "pointer to function taking no arguments and returning a HealthCalculator" and returns a EyeCandyCharacter. I assume that this isn't your intent.

Upvotes: 1

Related Questions