C++真可恶,这种情况用泛型也解决不了?
把问题简化到最简单的情况,略去细节上的一切代码.
我需要这样一个类,它封装不同个参数的函数:
template<typename type1,typename type2,...> class A
{
public:
typedef void (__stdcall * FUNC)(type1,type2,type3,...);
};
对于不同的参数个数,都要声明一个类,而且每一个还要有一个不同的名字.函数可以重载,但类不行.
不同的名字同样意味着,在编写一个使用A类的地方(通用),可能同样需要编写无数个重复代码,仅仅是为了适应不同的参数个数.
问题产生的根源在于,C++没有一个表示参数列表的通用方法.从而导致与此相关的一切问题都非常不方便.在某种程度上其实宏可以解决部分问题,但宏使用起来确实问题也挺多的,因为代码你看不到是在编译的时候才产生的.
编写太复杂的宏,肯定不是一个好方法.
如果要解决上面的问题,C++只需要加上一点,增加一个参数列表的表示方法.
template<paramlist pl> class A
{
public:
typedef void (__stdcall * FUNC)(pl);
};
声明:
A<int,int,void*> a3;
表示声明了一个3个参数的函数类型.
[解决办法]
Modern C++ Design中有一章就是讲这个的吧,自己看看吧
[解决办法]
呵呵,很容易实现~
重载一系列operator()
还需要知道Generic Programming中你没有调用到的代码是不被编译的
看看Modern C++ Design(Loki库)的实现,很有意思~
也可以看看boost中的实现
[解决办法]
他们大概是指 Typelists.
其实你的问题不用借助其它类库,按照你的做法:对于不同的参数个数,都要声明一个类,直接从一个模板参数列举到9个(N个?)模板参数就可以了。
这个和库的实现想法也基本一致,比如boost::bind也是列举到9的。
元编程本来就语法丑陋。
[解决办法]
C++的好处其实,个人感觉是给了程序员个人无限的扩展空间,其实有时候用JAVA,C#这类的托管类语言写程序,总觉得程序的表达能力限制在别人提供的库中了,很难扩展出超越那些库的能力,尤其是,那些库的函数有一些甚至不是用这种语言本身写的.当然C#在这方面做了不少工作,可以实现托管与非托管的混合实现,可是感觉依旧是严格的框架限制,这样可能对工程开发有不少好处,可是从个人角度来说,的确会觉得有些不爽.
相对来说C++什么东西都可以自己做,很好,同时也导致没有人能真的做出通用的一致认可的东西,选择太多了还不如没有选择.
很喜欢C++那种自己搭建整个世界的感觉,编译器生成二进制代码是很让人开心的事情.它的模板编程表达能力相当不错,不过还是没能熟练掌握,学习曲线看似平滑,实则越深入越难.
高效简洁的脚本,强大复杂的二进制语言,这两者都是我很支持的东西,顶一个.