有没有什么好的方法,可以在代码的重复和性能上实现平衡

刘地 发布于 2012/10/20 22:06
阅读 366
收藏 1

【DevOps必读】产品经理与程序员之间如何破局?>>>

我经常用C++处理一下数值计算问题,函数回调是经常使用的,但是有时我不能使用函数而要使用类,这是,我就得苦逼的把调用函数重载一次,因为函数和类有很多种,我就得每次发现新的就复制粘贴修改……,后来使用静态成员函数和静态数据成员,可是这种不支持递归的,很恶心,现在我使用的是这个版本:

struct fun_1p_type
{
virtual double operator()(double)=0;
};
template <typename T>
struct pkg_0pt : fun_1p_type
{
double *adr;
T      *ftp;
inline   pkg_0pt(){}
inline   pkg_0pt(double *x,T *p){adr=x,ftp=p;}
virtual ~pkg_0pt(){}
double operator()(double x)
{
*adr=x;
return ftp->operator()();
}
};
template <typename T>
struct pkg_1pt : fun_1p_type
{
T *ftp;
inline   pkg_1pt(){}
inline   pkg_1pt(T *p){ftp=p;}
virtual ~pkg_1pt(){}
double operator()(double x)
{
return ftp->operator()(x);
}
};
template <typename T>
struct pkg_fac : fun_1p_type
{
double (*fac)(double);
inline   pkg_fac(){}
inline   pkg_fac(double (*p)(double)){fac=p;}
virtual ~pkg_fac(){}
double operator()(double x)
{
return fac(x);
}
};

创建函数时,用fun_1p_type的指针——不得不说还是很恶心,有新的情况还是要修正,好在只要写个新的子类就行了,轻松许多,可是类名不能重载啊,经常弄错类名,照旧苦逼……

求解决方法…………

话说现在C++有哪种编译器实现lambda了?除了vs2010之外的

加载中
0
mallon
mallon
换个语言
0
宏哥
宏哥

不知道C++

如果你需要的是lambda

lambda 就是函数指针

如果不知道函数指针, 回炉学习C.

0
刘地
刘地

引用来自“宏哥”的答案

不知道C++

如果你需要的是lambda

lambda 就是函数指针

如果不知道函数指针, 回炉学习C.

函数指针我当然会用

我现在想要的是在C++里实现伪接口的效果

0
宏哥
宏哥

引用来自“刘地”的答案

引用来自“宏哥”的答案

不知道C++

如果你需要的是lambda

lambda 就是函数指针

如果不知道函数指针, 回炉学习C.

函数指针我当然会用

我现在想要的是在C++里实现伪接口的效果

函数指针, 指来指去, 还不够 "伪", 只需函数长得一样即可

你可以用任意的数据结构来存放函数指针, 比如hashmap, 

这样不够 伪, 怎样才算伪

0
刘地
刘地

引用来自“宏哥”的答案

引用来自“刘地”的答案

引用来自“宏哥”的答案

不知道C++

如果你需要的是lambda

lambda 就是函数指针

如果不知道函数指针, 回炉学习C.

函数指针我当然会用

我现在想要的是在C++里实现伪接口的效果

函数指针, 指来指去, 还不够 "伪", 只需函数长得一样即可

你可以用任意的数据结构来存放函数指针, 比如hashmap, 

这样不够 伪, 怎样才算伪

我想让函数可以接受传入的既可以是函数指针,也可以是伪函数(的地址/引用),甚至是一个部分指定了参数的函数。
0
宏哥
宏哥

引用来自“刘地”的答案

引用来自“宏哥”的答案

引用来自“刘地”的答案

引用来自“宏哥”的答案

不知道C++

如果你需要的是lambda

lambda 就是函数指针

如果不知道函数指针, 回炉学习C.

函数指针我当然会用

我现在想要的是在C++里实现伪接口的效果

函数指针, 指来指去, 还不够 "伪", 只需函数长得一样即可

你可以用任意的数据结构来存放函数指针, 比如hashmap, 

这样不够 伪, 怎样才算伪

我想让函数可以接受传入的既可以是函数指针,也可以是伪函数(的地址/引用),甚至是一个部分指定了参数的函数。

让你的函数接受以下结构体作为参数

struct t_virtual_process {

void *func_ptr(arg... ),

int argc,

chart **argv

}

剩下随便你搞

0
Lunar_Lin
Lunar_Lin
0. 不太理解你对递归的需求;  1. 看来你依旧是无法接受boost::bind.  你试试 测试下 release版本的boost::bind,性能是超过虚函数的.  boost下也有lambda 的实现. 何苦排斥人家boost呢? 好歹人家一个个都是C++标准组织私下里通过的库, 审查还是很严的.   嫌人家丑,就当我没说, 嫌编译慢, 试试预编译头(还慢, 那就当我没说), 担心速度慢, 那就开全优化, 测试几个benchmark, 如果发现性能差, 那就去发帖子去骂boost 垃圾吧.  : )
0
刘地
刘地

引用来自“Lunar_Lin”的答案

0. 不太理解你对递归的需求;  1. 看来你依旧是无法接受boost::bind.  你试试 测试下 release版本的boost::bind,性能是超过虚函数的.  boost下也有lambda 的实现. 何苦排斥人家boost呢? 好歹人家一个个都是C++标准组织私下里通过的库, 审查还是很严的.   嫌人家丑,就当我没说, 嫌编译慢, 试试预编译头(还慢, 那就当我没说), 担心速度慢, 那就开全优化, 测试几个benchmark, 如果发现性能差, 那就去发帖子去骂boost 垃圾吧.  : )
不是无法接受,而是不理解怎么实现的,担心使用时出现无法预料的错误
Lunar_Lin
Lunar_Lin
像bind的底层原理 肯定 就是调用处 能inline就inline, 不适合inline的就 类对象包装下函数指针和预定义参数.
Lunar_Lin
Lunar_Lin
0. 熟悉模板, 熟悉元编程常规的那套做法, 然后看boost源代码. 不过即使你很熟悉模板 仍有一定难度. 主要是大量编译器的hack干扰理解. 1. boost的文档把潜在的危险都说的比较清楚. 如果你不放过其描述的每一句话. 那应当就是安全的. 开源不容易见到像boost这么好的文档. 2. 测试保证安全.
0
billzheng
billzheng
能不能贴多一些代码,我感觉你的设计存在问题.比如,你的functor根本没有必要去实现默认构造函数和析构函数,然后根本不需要从fun_1p_type继承.  贴多一些代码,让我们看看你怎么使用的。
0
helloworld_go
helloworld_go
感觉可能要用模板,现在c++好几个主流的数学库都是充分利用了模板,要不然写起来是很累。
返回顶部
顶部