0

ライブラリを使用するには、同じ基本名を持つ異なるクラスを使用する必要があります。いえ

MyClass
MyClassImpl
PreMyClass

等々。テンプレートでそれらを使用するには、これらすべてのクラス名を渡す必要があります。

template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
{
  public:
  ClassThatUsesAllTheseObjects();
  private:
  T myClass;
  TImpl myClassImpl;
  PreT myPreClass;
};

MyClassテンプレート引数としてプリンシパルのみを指定し、必要に応じて他の名前を作成して、同じ結果を得ることができますか?

4

2 に答える 2

1

次の 2 つのオプションが考えられます。

  1. タグを使って差をつけましょう。したがって、たとえば a template <class T> myClass、 a がstruct impl_t{}, struct pre_t{}, struct base_t{}あり、次のように gthem を使用します。

コード:

myClass<base_t> ; // instead of plain MyClass
myClass<impl_t> ;// instead of plain MyClassImpl
myClass<pre_t> ; // instead of myPreClass

テンプレートの特殊化により、それらの定義が簡単/可能になるはずです。

  1. 特性ですが、その側にはすでに答えがあります:-)
于 2015-06-10T09:13:23.567 に答える
1

質問の設定がよくわかりませんが、場合によっては、特性メカニズムのようなことをしたいかもしれません。

あなたが具体的な を書き、MyClass他の人がそれを気に入るとします。具体的なクラスのグループごとに、次のようにします。

// This is common
template <typename T>
struct foo_traits
{

};

// This is for each set of concrete classes
template<>
struct foo_traits<MyClass>
{
   using Impl = MyClassImpl;
   using Pre = PreMyClass; 
};

...

次に、特性クラスを次のように使用します。

template <
    typename T, 
    class Impl = typename foo_traits<T>::Impl,
    class Pre = typename foo_traits<T>::Pre>
class ClassThatUsesAllTheseObjects
{
  public:
  ClassThatUsesAllTheseObjects();
  private:
  T myClass;
  Impl myClassImpl;
  Pre myPreClass;
};

これにより、主要な具象クラスの「自然な友達」とは何かを説明できます。

于 2015-06-10T09:09:46.033 に答える