3

C++ クラス テンプレートがあります。テンプレート パラメーター クラス T を取り、型 T のオブジェクトを、data() というメソッドを介してアクセス可能なプライベート メンバーとして格納します。以下のコードはそれを示しています。クラス テンプレートで、型 T を考慮した便利なコンストラクターを提供したいと考えています。たとえば、T のフィールドの一部をパラメーターとして受け取り、カプセル化された T オブジェクトをその値で初期化するコンストラクターです。

これを行う 1 つの方法は、ユーザーにテンプレートのインスタンス化から派生させ、そこに独自のコンストラクターを追加させることですが、当然のことながら、ユーザーに派生クラスを作成させずに ctor を提供する方法を用意したいと思います。

template <class T>
class Templ
{
public:
     T& data();
     const T& data() const;
private:
     T obj;
};

ユーザーが便利なコンストラクターを必要とする場合、Templ を派生させる必要があります。

class MyClass : public Templ<MyData>
{
public:
     MyClass (int size, MyClass* parent, float temperature, std::string name);
};

私はいくつかのC++ 11のものを読んで、STLのようなコンストラクターテンプレートを持つことについてのアイデアを持っていました std::list::emplace() メソッドのセットがありますが、一般的なベストプラクティスのソリューションが何であるかはわかりません.

4

1 に答える 1

7

ええ、C ++11の可変個引数の完全転送はあなたが望むものです:

template <class T>
class Templ
{
public:
     template<typename... Args>
     explicit Templ(Args&&... args) : obj(std::forward<Args>(args)...) {}

     T& data();
     const T& data() const;
private:
     T obj;
};

Templこれにより、コンストラクターの引数がコンストラクターに転送Tされます。

しかし、私は疑問に思っています、なぜこのクラスを持っているのですか?あなたは何をしようとしているのですか?

于 2013-02-10T21:06:42.793 に答える