C ++传递函数,没有定义类的参数数量

时间:2016-03-01 22:12:16

标签: c++ function class pointers reference

我正在解决这个问题,我在这里问this other question,但即使我得到了结果,我也无法得到这个东西。在我们开始之前,我使用指针在C之前传递函数,但我对C ++相对较新,而且指针不传递具有未知参数的函数。

我的问题是:

如何将函数传递给类,而不必知道它需要多少个参数。如果我想提供要绑定到类中的函数,我该怎么办?类似的东西:

ac ac1(args_of_the_object, a_function_with_its_arguments)

我在类初始化列表中得到了bind函数,感谢任何帮助过的人,

function<void()> sh = bind(&hard_coded_function_name, argument);

我可以在创建类的对象时设置参数:

class_name(type ar) : argument(ar) {};

你明白了。事实是,我无法将函数本身传递给类。我尝试在类初始化列表中稍作修改使用它:

class_name cl1(args, bind(&func_i_want, arguments));

但是它导致了堆栈转储错误。

谢谢!

编辑:(评论太长了)

#include <iostream>
#include <cmath>
#include <limits>
#include <vector>
#include <functional>

using namespace std;

void diffuse(float k){
    cout << " WP! " << k;  
}

class Sphere{
    public:
        function<void()> sh;
        Sphere (function<void()> X) : sh(X) {};

        //another try
        function<void()> sh;
        Sphere (void (*f)(float)) : sh(bind(&f, arg)) {}; // This is not what I want obviously still I tried it and it doesn't work either.

        void Shader(){
            sh();
        }
};


Color trace(vector<Sphere>& objs){

    // find a specific instance of the class which is obj in this case
    // Basically what I'm trying to do is
    // assigning a specific function to each object of the class and calling them with the Shader()

    obj.Shader();

    // Run  the function I assigned to that object, note that it will eventually return a value, but right now I can't even get this to work.
}

int main() {
    vector<Sphere> objects;
    Sphere sp1(bind(&diffuse, 5));
    Sphere sp1(&diffusea); // I used this for second example
    objects.push_back(sp1);

    trace(objects);
    return 0;
}

如果您想查看以下内容,请输入以下代码:LINK

1 个答案:

答案 0 :(得分:0)

不,您只能存储类型已知的数据(在编译时)。

但是,您可以将该函数作为参数传递。功能模板可以处理各种类型。

class Sphere {
    public:
        template<typename F>
        void shade(F&& f);
};

例如

void functionA(int) {}
void functionB(double) {}

Sphere sphere;

sphere.shade(functionA);
sphere.shade(functionB);