异构类型的成员函数映射

时间:2013-09-19 04:15:41

标签: c++

我正在尝试编写一个异构函数指针的映射,并在一个较小的程序中模仿它,该程序具有取“int”或“double”val的函数。

    #include <iostream>
    #include <boost/any.hpp>
    #include <map>
    #include <sstream>

    using namespace std;

    class Functions
    {
    public:
        void intF(int f) { cout << " Value int : " << f << endl; }
        void doubleF(double f) { cout << " Value double : " << f << endl; }
    };

    const boost::any convertInt(const string& s)
    {
        cout << " string passed : " << s << endl;
        std::istringstream x(s);
        int i;
        x >> i;
        cout << " Int val : " << i << endl;
        return i;
    }

    const boost::any convertDouble(const string& s)
    {
        cout << " string passed : " << s << endl;
        std::istringstream x(s);
        double i;
        x >> i;
        cout << " Double val : " << i << endl;
        return i;
    }

    typedef void (Functions::*callFunc)( const boost::any);

    typedef const boost::any (*convertFunc)( const string&);

    struct FuncSpec
    {
        convertFunc _conv;
        callFunc _call;
    };

FuncSpec funcSpec[] = {
    { &convertInt, (callFunc)&Functions::intF },
    { &convertDouble, (callFunc)&Functions::doubleF },
};

int main()
{
    string s1("1");
    string s2("1.12");

    callFunc c = funcSpec[0]._call;
    convertFunc co = funcSpec[0]._conv;

    Functions F;
    (F.*c)(((*co)(s1)));

    c = funcSpec[1]._call;
    co = funcSpec[1]._conv;

    (F.*c)(((*co)(s2)));

    return 0;
}

当我运行这个程序时,我看到正确打印的double值但是int值是乱码。有人可以帮我吗?还有一种更好的方法来实现此功能。在我的计划中,我有两个功能 - 一个采用vector<int>而另一个采用vector<double>。我必须从文件中读取数据并在具有这两个函数的类的对象中调用相应的setter。

1 个答案:

答案 0 :(得分:2)

将成员函数转换为您正在执行的其他类型无效。试试这个:

class Functions
{
  public:
    void intF(boost::any input)
    {
      int f = boost::any_cast<int>(input);
      cout << " Value int : " << f << endl;
    }

    void doubleF(boost::any input)
    {
      double f = boost::any_cast<double>(input);
      cout << " Value double : " << f << endl;
    }
};

.
.
.

FuncSpec funcSpec[] = {
  { &convertInt, &Functions::intF },
  { &convertDouble, &Functions::doubleF },
};