私はマップboost::functions
を試しています。だから私は入力と出力のパラメータで、文字列名でそれらを呼び出すことができます。変数をvoidポインタ、またはC++のvoidポインタ参照に送ります
例:私は、入力と出力変数を作成し、処理するMyFuncs::CallFunc()
に自分のポインタを送りたい
MyFuncs::CallFunc("MyClass::TestFunc", void* input, void* output);
。
私はそれがintに値だ関数に(void* input)
ポインタを送信し、抽出することができ、文字列など
私はそれが値を受け取るために自分のスペースだ割り当て(void* output)
を送信することはできません。呼び出された関数の内部にnew type(var)
を作成する必要があります。そうしないと、関数は戻ってもスコープから外れます。
MyFuncs.h
//MyFuncs.h
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <map>
class MyFuncs
{
public:
static std::map<std::string, boost::function<void (void*, void*&)> > myfuncs;
template<class T>
static void RegisterFunc(const std::string& name, void (T::*func) (void*, void*&), T* instance)
{
myfuncs[name] = boost::bind(func, instance, _1, _2);
}
static void CallFunc(const std::string& name, void* input, void*& output)
{
myfuncs[name](input, output);
}
};
std::map<std::string, boost::function<void (void*, void*&)> > MyFuncs::myfuncs;
MyClass.h
//MyClass.h
#include "MyFuncs.h"
class MyClass
{
public:
MyClass()
{
MyFuncs::RegisterFunc("MyClass::GetNumber", &MyClass::GetNumber, this);
MyFuncs::RegisterFunc("MyClass::GetString", &MyClass::GetString, this);
MyFuncs::RegisterFunc("MyClass::EditNumber", &MyClass::EditNumber, this);
MyFuncs::RegisterFunc("MyClass::EditString", &MyClass::EditString, this);
}
void GetNumber(void* input, void*& output)
{
int var = 1234;
output = static_cast<void*>(new int(var)); //WORKS, var eats memory
//output = static_cast<void*>(&var); //ERROR, var goes out of scope
}
void GetString(void* input, void*& output)
{
std::string var = "Get test";
output = static_cast<void*>(new std::string(var)); //WORKS, var eats memory
//output = static_cast<void*>(&var); //ERROR, var goes out of scope
}
void EditNumber(void* input, void*& output)
{
int var = *static_cast<int*>(input); //WORKS, var gets 4321 OK
output = static_cast<void*>(new int(var)); //WORKS, var eats memory
//output = static_cast<void*>(&var); //ERROR, var goes out of scope
}
void EditString(void* input, void*& output)
{
std::string var = *static_cast<std::string*>(input); //WORKS, var gets "Edit test" OK
output = static_cast<void*>(new std::string(var)); //WORKS, var eats memory
//output = static_cast<void*>(&var); //ERROR, var goes out of scope
}
};
MyApp.cpp
//MyApp.cpp
#include "MyClass.h"
void main()
{
MyClass myclass;
void* in;
void* out;
MyFuncs::CallFunc("MyClass::GetNumber", NULL, out); //atempting to fill the variable
int getNumOut = *static_cast<int*>(out);
printf("MyClass::GetNumber = %d \n", getNumOut);
MyFuncs::CallFunc("MyClass::GetString", NULL, out); //atempting to fill the variable
std::string getStrOut = *static_cast<std::string*>(out);
printf("MyClass::GetString = %s \n", getStrOut.c_str());
int editNum = 4321;
in = static_cast<void*>(&editNum);
MyFuncs::CallFunc("MyClass::EditNumber", in, out); //atempting to fill the variable
int editNumOut = *static_cast<int*>(out);
printf("MyClass::EditNumber = %d \n", editNumOut);
std::string editStr = "Edit test";
in = static_cast<void*>(&editStr);
MyFuncs::CallFunc("MyClass::EditString", in, out); //atempting to fill the variable
std::string editStrOut = *static_cast<std::string*>(out);
printf("MyClass::EditString = %s \n", editStrOut.c_str());
getchar(); //wait for close
}
、あなたは[ 'のstd :: any'](HTTPの使用を検討したいと思うでしょう/en.cppreference.com/w/cpp/utility/any)では 'void * 'ではなく。あなたはC++ 17が正式にロールアウトする前にBoostバージョンを使うことができます – WhiZTiM
@WhiZTiM今すぐ調査していただきありがとうございます。 – aquawicket
Opps。私はまだいくつかのクロスプラットフォームの特質のためにC++ 98です。なぜ私はまだここでブーストを使用しているのですか? std :: anyは私にはまだ利用できません。 – aquawicket