从函数指针调用带有多个参数的多个函数?

时间:2018-06-28 02:16:12

标签: c++

我试图定义一个函数指针来调用具有不同参数的多个函数,但是现在我坚持我的想法是,没有人有一个主意,或者可以看到我做错了什么,因为我不能:smile:如果您可以帮助我,会有所帮助。

//Goal:  Calling the sum function from the function pointer with the t1 struct as parameter
//Theory:  As my theory after first param the function will go  -4 down in memory and look for the second variable but nope
float sum(float &x, float &y) //a random test-foo function
{
    float s = x + y;
    printf_s("(%X)x: %f + (%X)y: %f | Result: %f\n",&x, x, &y, y, s);
    return s;

}
typedef float(*fsum)(void* params);
fsum fsm = (fsum)∑
struct t1 {
    float f[2]; //the params will be here
}tx1;
int main()
{
    tx1.f[0] = 4.3; tx1.f[1] = 2;  //setting values on the params
    printf_s("tx1: 0x%X\ntx1.f[0]: 0x%X\ntx1.f[1]: 0x%X\n", &tx1, &tx1.f[0], &tx1.f[1]);
    fsm(&tx1.f[0]); //calling the function pointer
    getchar();
   return 0;
}

我的主要目标是稍后使用它来调用带有不同参数的不同函数,而这些函数只有1个函数指针和1个指向参数的指针 像:

if(statement1)
    funcPointer = func1; //change the func pointer to point to func1
else if(statement1)
    funcPointer = func2;  //change the func pointer to point to func2
funcPointer(paramPointer); //call the function pointer

还有第二个问题:假设我有一个用C ++编写的.dll,它有一个名为“ fuu”的函数,我在另一个进程中加载​​了该dll,我该如何用另一个不同的方法加载“ fuu”函数呢? C ++ dll?

1 个答案:

答案 0 :(得分:0)

我不喜欢您的模式,但是如果您真的坚持使用它,则可以使用多态。

class BaseProcessor{
      public:
      virtual float func(void *); };

class Processor1 : public BaseProcessor {
      public:
      type3 func(void * param){ 
           type3 func1((type1*) param);
      }

      private:
           type3 func1(type1 * param){
            //implementation goes here
           }         };


class Processor2 : public BaseProcessor {
      public:
      type3 func(void * param){ 
           return func2((type2 *) param);
      }

      private:
           type3 func2(type2 * param){
            //implementation goes here
           }
    };

并像这样使用它。

    BaseProcessor * processor;

    if(statement1)
        processor = new Processor1; 
    else if(statement1)
        processor = new Processor2; 

    processor->func(paramPointer);

void *是对C ++设计不良的警告。

如果您没有模棱两可的签名,则可以简单地重载func()或将实现附加到数据:

class base_t{
    public:
    virtual float sum();
}

class t1 : public base_t {
    public:
    float f[2]; //the params will be here

    sum(){/* Implemenation goes here*/}
};