在编译/运行时检查特定结构/类没有任何虚函数的一种不错的方法。为了确保在进行放置new 时,正确的字节对齐,需要进行此检查。
拥有一个虚拟函数最多将使整个数据移动一个vtable指针大小,这将与放置new运算符一起将事情完全弄乱。
一些更多详细信息:我需要可以在所有主要编译器和平台上运行的功能,例如Windows,Linux和Solaris之上的VS2005,VC++ 10,GCC 4.5和Sun Studio 12.1。
可以保证在以下情况下可以工作的东西就足够了:
struct A { char c; void m(); };
struct B : A { void m(); };
如果有人决定进行此更改:
struct A { char c; virtual void m(); };
struct B : A { void m(); };
看到编译时错误显示
struct A must not contain virtual functions.
真是太好了 最佳答案
您几乎可以肯定做错了什么。
但是,鉴于您已决定做某事,因此您不希望知道您的tpe是否没有虚拟功能。您想知道是否可以将您的类型视为字节数组。
在C++ 03中,您是POD类型吗?幸运的是,有一个特征,恰本地命名为is_pod<T>
。它由C++ 03中的Boost/TR1提供,尽管它需要相对较新的编译器[gcc> 4.3,MSVC> 8,其他我不知道]。
在C++ 11中,可以通过询问您的类型是否可复制来简化您的要求。再次,有一个特点:is_trivially_copyable<T>
。
无论哪种情况,都有is_polymorphic<T>
,但是正如我所说,这实际上并不是您想要的。如果您使用的是较旧的编译器,那么从Boost中获得它的确具有开箱即用的优势。它执行别处提到的sizeof
测试,而不是像false
那样简单地报告所有用户定义类型的is_pod
。
无论如何,您最好确保自己的构造函数是noop的120%;那不是可以验证的东西。
我刚刚看到了您的修改。在您列出的内容中,Sun Studio是仅有的一个可能没有必要的内在函数才能使这些特征正常工作的组件。 gcc和MSVC都已经有几年了。
关于c++ - 由于放置新用法而禁止虚拟功能的一种体面方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6421130/