2

というテンプレート クラスとfriendly_pointというユーザー定義クラスがfooあり、foo引数の数と型が異なるいくつかのコンストラクター ( foo()foo(int)、および など) があるとしfoo(int, char *)ます。

friendly_point次のようなクライアント コードを記述できるように、テンプレートを実装する方法があるかどうかを知りたいです。

friendly_point<foo> obj1;
friendly_point<foo> obj2(1);
friendly_point<foo> obj3(1,"abc");

さらに、friendly_pointテンプレートのユーザーがメモリ プールをフックできるようにテンプレートを実装して、クライアントに提供するすべてのオブジェクトをそのプールから取得することはできますか?

4

2 に答える 2

5

これは既に実行できます。スマート ポインターをサブクラス化し、既に行っているように完全転送emplaceを使用するだけです。

#include <memory>
#include <utility>

template<class T>
struct friendly_ptr
{
    std::shared_ptr<T> p;
    template<typename... Params>
    friendly_ptr(Params&&... params) : p(new T(std::forward<Params>(params)...))
    {
    }

};

int main()
{
    friendly_ptr<int> p(1);
}
于 2013-03-29T02:34:52.473 に答える
0

Mehrdad が示すように、C++11 では転送が導入されています。

C++03 では、テンプレート ala を使用して試すことができます。

template <typename T>
class Wrapper
{
  public:
    Wrapper() { }

    template <typename T1>
    Wrapper(const T1& t1) : t_(t1) { }

    template <typename T1. typename T2>
    Wrapper(const T1& t1, const T2& t2) : t_(t1, t2) { }

    template <typename T1. typename T2, typename T3>
    Wrapper(const T1& t1, const T2& t2, const T3& t3) : t_(t1, t2, t3) { }
    ...

  private:
    T t_;
};

T関数が呼び出されるまですべてのエラーがチェックされるわけではないため、現在サポートされているよりも多くの引数のプレースホルダーを使用しても問題ありません。

プリプロセッサ マクロを使用して、通常は十分な数の引数に対してこのような転送関数を生成できますが、異常な数ではありません。ブースト プリプロセッサ ライブラリを使用すると、簡単に実行できる場合とそうでない場合があります。

単純なケースではこれで十分ですが、一般的な解決策ではありません。const具体的には、非パラメータを通過させたい場合。あなたは出来る:

  • const引数リストに残しますが、非const参照は一時変数にバインドできないため、呼び出し元はパラメーター値を準備する際に多くの通常の式を使用できません。または
  • 参照を受け入れてから - 性constを捨てますconstが、それによって言語の意図的な保護機能が削除され、const文字列リテラルなどを含む純粋な変数を変更しようとする試みが許可される可能性があり、未定義の動作が発生します。
于 2013-03-29T04:49:36.743 に答える