定时器线程已通过Function *和Param

时间:2011-04-29 05:46:41

标签: class templates function pointers

我正在为我的第一个iPhone应用程序完成我的服务器,我想实现一个简单的小功能。

如果另一个函数在某个等待期后返回某个值,我想运行一个函数(也许是方法)。相当简单的概念....对吧?

这是我的基础。

template <typename T,class TYP>
struct funcpar{
 T (*function)(TYP);
 TYP parameter;
 funcpar(T (*func)(TYP),TYP param);
 funcpar& operator=(const funcpar& fp);
}; 

这里的目标是能够调用funcpar::function(funcpar::parameter)来运行存储的函数和参数,而不必担心其他任何事情......

当我尝试使用void *参数而不是模板时,我无法将内存复制为对象(因为我不知道最终对象会是什么,或者就此而言)当我尝试多个计时器时,每个对象的参数都会更改为传递给新计时器的新参数...使用上一个结构我有一个

问题:

是否可以在类的方法中创建一个包含这种类型对象的全包指针?我可以模板化一种方法,而不是全班吗?它的功能是否与函数模板完全相同?

我有一个管理类,它包含这些“工作”的向量,并且可以很好地处理所有事情。我只是不知道如何在结构中使用模板化函数,或者如何在类中的单个方法上使用模板。

我也在我的自定义简单线程池中使用它,并且它工作得相当好,并且有同样的问题......

我还有另一个问题:

我可以在运行之前存储带参数的函数吗?像toRun = dontrunmeyet(withThisParameter);这样的东西?我的结构甚至是必要的吗?

我是否错误地解决了这一切?

如果这个过于模糊,我可以用我的整个上下文代码为你设置

1 个答案:

答案 0 :(得分:1)

为了创建一个带有模板参数的类方法,是的,它几乎就像一个函数模板。例如:

class A
{
        public:
                template<typename T>
                void my_function(const T& value) { }
};

int main()
{
        A test;
        test.my_function(5);

        return 0;
}

其次,对于你的结构,你实际上可以把它变成一个functor-object,通过重载operator(),让你调用结构 - 如果它是一个函数而不是必须实际调用特定的函数指针结构内的成员。例如,您的结构可以重写为:

#include <iostream>

template <class ReturnType, class ParameterType>
class funcpar
{
    private:
        ReturnType (*function)(ParameterType);
        ParameterType parameter;

    public:
        funcpar(ReturnType (*func)(ParameterType),ParameterType param):
            function(func), parameter(param) {}

        funcpar& operator=(const funcpar& fp);

        //operator() overloaded to be a function that takes no arguments
        //and returns type ReturnType
        ReturnType operator() ()
        {
            return function(parameter);
        }
};


int sample_func(int value)
{
    return value + 1;
}


int main()
{
    funcpar<int, int> test_functor(sample_func, 5);

    //you can call any instance of funcpar just like a normal function
    std::cout << test_functor() << std::endl; 

    return 0;
}
顺便说一句,你需要functor对象(或你的结构等)才能在C / C ++中调用函数之前将动态参数绑定到函数...你不能“存储”参数具有实际功能。将参数绑定到函数实际上称为闭包,在C / C ++中,创建闭包需要结构/类或某种类型的关联数据结构,可用于将函数与存储在内存中的特定参数绑定。仅用于该函数调用的特定实例。