我没有什么问题:
我正在解决通过指针调用函数并在连续内存块中传递给它的问题。 我的目标是让函数命名为例如
CallFunc(void * func,void *params, unsigned int param_length);
我将发送函数指针,指向函数参数的指针以及最终的参数长度,这个调用函数将使用它的参数调用传递的函数。
我想用C / C ++编写这个,但是如果有人知道,如何在其他语言中解决这个问题,支持DLL生成和导出函数,它也会很好。
感谢您的回答, Ellesmess
P.S。 >我很抱歉我的英语,但我是捷克人,谢谢:o)
答案 0 :(得分:0)
在不知道您的参数类型的情况下,无法从void *中恢复它们。所以这是不可能的。 您需要更改CallFunc界面。
我不确定这是你需要的,但它正在发挥作用。
template <typename Func>
void CallFunc(Func func)
{
func();
}
template <typename Func, typename Arg1_Type>
void CallFunc(Func func,Arg1_Type arg1)
{
func(arg1);
}
template <typename Func, typename Arg1_Type, typename Arg2_Type>
void CallFunc(Func func,Arg1_Type arg1,Arg2_Type arg2)
{
func(arg1,arg2);
}
//defination of CallFunc untill Arg10 or Arg20
.....
//some function
void somefunction(int x)
{
std::cout<<x<<std::endl;
}
//and calling it in main
CallFunc(somefunction,7);
答案 1 :(得分:0)
C ++ 0x有可变参数模板,它允许这种魔术:
#include <iostream>
using namespace std ;
template<typename... Args> void CallFunc (void (*func)(Args...), Args... args) {
func (args...) ;
}
void f (int x, double y) { cout << x << ", " << y << endl ; }
int main() { CallFunc (&f, 123, 5.6) ; }
答案 2 :(得分:0)
好的,再试一次:) 再一次,我不确定这是你需要的东西+我相信你需要改变你的代码风格(因为从你的问题我填补你正在做的事情变得奇怪)。
这是我的解决方案:
#include <iostream>
#include <boost/function.hpp>
using namespace std;
template <typename Ret>
void CallFunc(boost::function<Ret ()> func)
{
func();
}
template< typename Ret, typename Arg1>
Ret CallFunc(boost::function<Ret (Arg1)> func, void * args[])
{
Arg1 * arg1= static_cast<Arg1*> (args[0]);
return func(*arg1);
}
template<typename Ret, typename Arg1,typename Arg2>
Ret CallFunc(boost::function<Ret (Arg1,Arg2)> func, void * args[])
{
Arg1 * arg1= static_cast<Arg1*> (args[0]);
Arg2 * arg2= static_cast<Arg2*> (args[1]);
return func(*arg1,*arg2);
}
int somefunction(int x)
{
return x*x;
}
int main()
{
boost::function<int (int)> func(somefunction);
int x=17;
void * args[1];
args[0]=&x;
int y = CallFunc(func,args );
std::cout<<y<<std::endl;
return 0;
}