私は異種関数ポインタのマップを書き込もうとしており、「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 つの関数がvector<int>
ありvector<double>
ます。ファイルからデータを読み取り、これら 2 つの関数を持つクラスのオブジェクトで適切なセッターを呼び出す必要があります。