0

私は C++ が初めてで、テンプレート クラスについては知りませんが、私の問題にはテンプレートを使用できると思います。私は2つのクラスを持っています、

class Foo
{
 public:
    Foo (int a, char b);
};

class Bar
{
 public:
    Bar (int a);
};

そして、これらのクラスは互いに関連していません。

私の質問は、テンプレート クラスを作成して と のインスタンスを作成することは可能FooですBarか? 次のように使用できるもの:

TemplateClass<Foo>::createClass();

しかし、パラメータについてはわかりません。

4

2 に答える 2

4

これには C++11 を使用できます。

template<typename T>
class TemplateClass
{
public:
   template<class... Args>
   static T createClass(Args&&... args)
   {
      return T(std::forward<Args>(args)...);
   }
};

Foo f = TemplateClass<Foo>::createClass(1, '1');
Bar b = TemplateClass<Bar>::createClass(1);

または、C++03 では別のオーバーロードを使用します。

template<typename T>
class TemplateClass
{
public:
   static T createClass()
   {
      return T();
   }
   template<typename Arg1>
   static T createClass(const Arg1& arg)
   {
      return T(arg);
   }
   template<typename Arg1, typename Arg2>
   static T createClass(const Arg1& arg1, const Arg2& arg2)
   {
      return T(arg1, arg2);
   }
};

等々...

于 2012-08-24T08:02:43.590 に答える
2

bindコンストラクターは通常の関数ではないため、他の関数メカニズムと一緒に簡単に使用することはできません。ForEver が示すように、C++11 を使用すると、機能が制限されたラッパーを簡単に作成できますが、C++11 を使用しない場合や、基本的な機能以上の機能が必要な場合は、これが難しくなる可能性があります。そのためにBoost.Factoryを使用できます。

于 2012-08-24T08:10:34.190 に答える