相关疑难解决方法(0)

C++技术:类型擦除与纯多态

比较两种技术的优点/缺点是什么?更重要的是:为什么以及何时应该使用另一个?这只是个人品味/偏好的问题吗?

尽我所能,我还没有发现另一篇明确解决我的问题的帖子.关于多态性和/或类型擦除的实际使用的许多问题中,以下似乎最接近,或者看起来如此,但它并没有真正解决我的问题:

C++ - &CRTP.类型擦除vs多态

请注意,我非常了解这两种技巧.为此,我在下面提供了一个简单,独立的工作示例,如果感觉不必要,我很乐意删除.但是,这个例子应该澄清这两种技术对我的问题意味着什么.我对讨论命名法不感兴趣.此外,我知道编译和运行时多态性之间的区别,但我不认为这与该问题相关.请注意,如果有的话,我对性能差异的兴趣会减少.但是,如果根据表现有一个引人注目的争论,我很想读它.特别是,我想听听具体的例子(没有代码),这些例子实际上只适用于这两种方法中的一种.

查看下面的示例,一个主要区别是内存管理,多态性保留在用户端,而类型擦除则整齐地隐藏起来,需要一些引用计数(或增强).话虽如此,根据使用场景,可以通过使用带有向量(?)的智能指针来改善多态性的情况,但对于任意情况,这可能很难变得不切实际(?).可能有利于类型擦除的另一个方面可能是公共接口的独立性,但为什么这将是一个优势(?).

通过简单地将以下所有代码块放入单个源文件中,使用MS VisualStudio 2008测试(编译和运行)下面给出的代码.它也应该在Linux上用gcc编译,或者我希望/假设,因为我认为没有理由不(?):-)为了清楚起见,我在这里拆分/分割代码.

这些头文件应该足够了,对(?).

#include <iostream>
#include <vector>
#include <string>
Run Code Online (Sandbox Code Playgroud)

简单的引用计数以避免增强(或其他)依赖性.此类仅用于下面的类型擦除示例.

class RefCount
{
  RefCount( const RefCount& );
  RefCount& operator= ( const RefCount& );
  int m_refCount;

  public:
    RefCount() : m_refCount(1) {}
    void Increment() { ++m_refCount; }
    int Decrement() { return --m_refCount; }
};
Run Code Online (Sandbox Code Playgroud)

这是简单的类型擦除示例/插图.它的复制和修改部分来自以下文章.主要是我试图让它尽可能清晰明了. http://www.cplusplus.com/articles/oz18T05o/

class Object {
  struct ObjectInterface {
    virtual ~ObjectInterface() {}
    virtual std::string GetSomeText() const = 0;
  };

  template< typename T > struct ObjectModel : ObjectInterface {
    ObjectModel( const T& …
Run Code Online (Sandbox Code Playgroud)

c++ paradigms

18
推荐指数
2
解决办法
3362
查看次数

标签 统计

c++ ×1

paradigms ×1