使用函数Object tr1 :: function<>调用仿函数

时间:2015-02-27 08:17:47

标签: c++ functor effective-c++

我尝试实现Scott Mayer书籍代码示例,该示例是关于通过函数对象调用functor

头文件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

main.cpp是:

#include "gamecharacter.h"

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

为什么功能&lt;&gt; object拒绝在healthvalue()

中调用operator()函数

2 个答案:

答案 0 :(得分:1)

EyeCandyCharacter ecc1(HealthCalculator());

声明一个名为ecc1的函数,该函数接受类型为&#34的参数;指向函数的指针不带参数并返回HealthCalculator&#34;并返回EyeCandyCharacter。我认为这不是你的意图。

答案 1 :(得分:0)

这是正确的调用,它应该由bind

调用
#include "gamecharacter.h"

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