4

pimpl イディオムの主な利点は、ヘッダーではなく実装ファイル内のデータ メンバーを非表示にすることです。ただし、コンパイラが必要に応じてテンプレートをインスタンス化できるようにするには、ヘッダーでテンプレートを完全に定義する必要があります。この場合、テンプレート化されたクラスに pimpl イディオムを使用する利点はありますか?

4

5 に答える 5

5

pimpl イディオムは、テンプレート化されたクラスで使用される場合、実際には何も隠しませんが、スローしないスワップを簡単に記述できます (ただし、C++11 のムーブ セマンティクスでは、これはあまり問題になりません)。

于 2011-09-26T23:29:57.623 に答える
1

厳密には pimpl のイディオムではないかもしれないが、知っておく必要があるほど似ているケースが 1 つあります。これは、タイプセーフでないバージョンに対してタイプセーフなテンプレート ラッパーを使用することです。

class MapBase
{
   public:
     void* getForKey(const std::string & k);
     void setForKey(const std::string & k, void * v);
     ...
};

template<typename T>
class MyMap
{
  public:
    T* getForKey(const std::string &k) { return (T*)base_.getForKey(k); }
    void setForKey( const std::string &k, const T* v) { base_.setForKey(k, T*v); }
  private:
   MapBase base_;
};

これで、 の使用はMyMap<T>MapBase の内部にさらされる必要がなくなり、これらの関数の根幹の実装を 1 つだけ取得できます。また、デカップリングをさらに強化するために、MapBase を抽象基本クラスにすることも検討します。

私が言ったように、それは正確にはにきびではありませんが、同じ問題の多くを同様の方法で解決します.

于 2011-09-27T00:01:47.107 に答える
1

大規模なプロジェクトでは、翻訳単位を分離するだけで、吹き出物の十分な理由になります。これはテンプレートでも機能します:

// main interface

template <typename> struct MyImpl;

class TheInterface
{
  MyImpl<int> * pimpl;
};

// implementation

#include "MyImpl.hpp" // heavy-weight template library

// TheInterface implementation
于 2011-09-26T23:31:52.707 に答える
0

慣用句を少し拡張すると、場合によっては少なくとも少しは理解できると思います。テンプレートでは、すべての操作が必ずしもテンプレート パラメーターに依存する必要はありません。Implしたがって、次のような pimpl イディオムを使用するクラスから継承できます。

struct FooPimpl;

class FooImpl {
  protected:
    FooPimpl* pimpl;
  public:
    void myCommonInterfaceMethod();
};

template <typename T> class Foo : public FooImpl {
  // stuff that depends on T
};

もちろん、これは状況によって大きく異なります。しかし、pimpl イディオムがテンプレート クラスのコンテキストで機能していることがわかります。

于 2011-09-27T00:03:04.277 に答える
0

それはまだかなり使用可能です - テンプレートであり、PIMPL の解決と実装に非常に使用可能な auto または shared ポインターを検討してください。それが最善の解決策であるかどうかは、問題によって異なります。

コンパイラが必要に応じてテンプレートをインスタンス化できるようにするには、テンプレートをヘッダーで完全に定義する必要があります。

テンプレートのメンバーとインターフェイスを宣言してから、型の cpp ファイルで#include必要な特殊化の定義を行い、そこで使用できます。

于 2011-09-27T00:20:57.177 に答える