【发布时间】:2013-11-13 07:44:36
【问题描述】:
我在c++模板元编程之后写了一个简单的float(float)函数对象:
class float_func
{
struct base {
virtual float operator()(float a) = 0;
};
template <typename F>
class wrapper : public base {
public:
wrapper(F& f) : f_(f) { }
virtual float operator()(float a) {
return f_(a);
}
private:
F f_;
};
public:
template <typename F> float_func(F& f) : funobj_(new wrapper<F>(f)) {}
float operator()(float a) {
return (*funobj_)(a);
};
private:
base* funobj_;
};
我想这样使用它:
#include <iostream>
#include <functional>
#include "my_float_fun.h"
struct FunObject {
float operator()(float a) const {
return a + 1;
}
};
float Func(float a)
{
return a - 1;
};
typedef float (*FuncPtr)(float a);
int main()
{
FunObject obj;
FuncPtr ptr = &Func;
float_func a = obj;
float_func b = ptr;
// float_func c = &Func; not compile
std::function<float(float)> d = &Func;
std::cout << a(1) << b(2) << std::endl;
return 0;
}
但是注释掉的行不能编译。另一方面, std::function 运行良好。
我应该如何修改我的 float_fun 类以仅支持函数指针本身(&Func)而不是函数指针对象(ptr)?
【问题讨论】:
-
float_func b = ptr;并没有按照你的想法去做。 -
template <typename F> float_func(F& f) : funobj_(new wrapper<F>(f)) {}其中F是FuncPtr而不是float。 -
另外,你想解决什么问题,你写了所有这些而不是仅仅使用
base? -
@kfsone:我把 F 作为 FuncPtr;我只是在学习类型擦除。
标签: c++ templates functional-programming