0

我正在尝试编写异构函数指针的映射,并在一个较小的程序中模仿它,该程序具有采用“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 值是乱码。有人可以帮我解决这个问题吗?还有没有更好的方法来实现这个功能。在我的程序中,我有 2 个功能 - 一个采用 a vector<int>,另一个采用vector<double>. 我必须从文件中读取数据并在具有这两个函数的类的对象中调用适当的设置器。

4

1 回答 1

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 },
};
于 2013-09-19T04:27:47.287 回答