c++ - 模板化函数指针?

标签 c++ templates

我想做这样的事情: 我希望用户提供一个返回类型和一个参数(永远只有一个),然后我希望用户能够提供符合此条件的函数指针。我将使用它来创建一个定时事件。 这里的问题是,通常对于模板,您必须提供 T 并创建一个新的类实例,但是在这种情况下,我需要它作为一种运行时。例如:

TimeEvent *explode  = new TimeEvent(int (the return type),data (the argument), explodeFunc (the function pointer);

这将创建并设置函数指针。然后调用者只需执行 explode.call() 即可调用它。 我怎么能实现这样的目标?

谢谢

最佳答案

boost.function + boost.bind是你可以用来做这个的东西:

int explodeFunc( std::string const & someString ) {
     std::cout << someString << " exploded" << std::endl;
     return 1;
}

及以后...

boost::function< int() > timeEvent = boost::bind(explodeFunc, "The world"); 
int retVal = timeEvent();

但我不确定这是不是你要找的

这是一个没有提升的简单版本:

#include <iostream>
#include <string>

template< typename R >
struct TimeEvent {
    virtual ~TimeEvent(){}
    virtual R call() = 0;
};

template< typename R, typename ParamType >
struct TimeEventT : TimeEvent<R> {
    typedef R (*callback_type)( ParamType const & );
    typedef ParamType param_type;
    TimeEventT( param_type const & param, callback_type cb )
        : TimeEvent<R>()
        , callback_( cb )
        , param_( param )
    {}

    R call() {
        return callback_( param_ );
    }

protected:
    callback_type callback_;
    param_type param_;
};

template< typename R, typename ParamType, typename ParamValueT >
TimeEvent<R> * create_time_event( 
    R (*cb)(ParamType const &),
    ParamValueT const & param
) {
    return new TimeEventT<R, ParamType>( param, cb );
}

int explodeFunc( std::string const & param ) { 
    std::cout << param << " exploded" << std::endl;
    return 1;
}

std::string explodeFuncString( std::string const & param ) { 
    return param + " really exploded this time";    
}

int main(){
    std::string param = "The world";
    TimeEvent<int> * timeEvent1 = create_time_event( explodeFunc, param );
    if( timeEvent1 ) {
        timeEvent1->call();
        delete timeEvent1;
    }
    TimeEvent<std::string> * timeEvent2 = create_time_event( explodeFuncString, param );
    if( timeEvent2 ) {
        std::cout << timeEvent2->call() << std::endl;
        delete timeEvent2;
    }
    return 0;
}

我希望你能理解这个想法并让它满足你的需求。

HTH

编辑:更新了模板化返回类型。 * 使 create_time_event 更加用户友好

关于c++ - 模板化函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3928835/

相关文章:

c++ - 使用 xcvdata 删除标准 TCP IP 端口不起作用

c++ - qpid 质子 on_sendable 只被调用一次

c++ - 仅针对单个函数的部分模板特化

C++11 模板方法中的自动返回类型

c++ - boost::trim_right_if 和空字符

c++ - 使用 Boost 序列化时如何删除此重复代码?

c++ - C++ (visual studio) 中同一符号的多重定义

c++ - 减少几乎重复的模板实例化

c++ - 为什么映射的构造函数允许我们在参数中传递比较器对象?

C++ 编译器不应用模板