【问题标题】:Timer Thread with passed Function* and Param具有传递函数*和参数的定时器线程
【发布时间】:2011-08-15 06:17:14
【问题描述】:

我正在为我的第一个 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); 这样的东西?我的结构甚至是必要的吗?

我是不是搞错了整个事情?

如果这过于模棱两可,我可以为您设置我的整个上下文代码

【问题讨论】:

    标签: class templates function pointers


    【解决方案1】:

    为了创建一个接受模板参数的类方法,是的,它几乎可以像函数模板一样工作。例如:

    class A
    {
            public:
                    template<typename T>
                    void my_function(const T& value) { }
    };
    
    int main()
    {
            A test;
            test.my_function(5);
    
            return 0;
    }
    

    其次,对于您的结构,您实际上可以将其转换为函子对象,通过重载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;
    }
    

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

    【讨论】:

    • 这真是太棒了!谢谢!课程:进行中。
    • 顺便说一句,我更新了帖子以回答您关于需要结构/类以执行您所询问的动态参数绑定的问题。
    猜你喜欢
    • 2022-08-05
    • 2015-07-23
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多