私はおそらく完全にこれをベースにしていませんが、私はC#から来ていますので、事前にお詫び申し上げます。C++型消去/型カプセル化?タイプを発見
まず、私がやろうとしていることについてちょっと説明します。私は、私はその後、やりたいことは、工場のリストを持っている(STLベクトルやリストを言う)と、テンプレートの種類によってそれらを検索することができている
template<typename _Ty>
class Factory
{
public:
virtual std::shared_ptr<_Ty> Create() = 0;
};
として私のコードで定義された工場出荷時の基本クラスを持っています。私は、その後のタイプを比較するための容器に方法のいくつかの種類を含めたい
class FactoryContainer
{
struct FactoryConcept {
virtual ~FactoryConcept() {}
};
template< typename _Ty > struct FactoryModel : FactoryConcept {
FactoryModel(const _Ty& t) : factory(t) {}
virtual ~FactoryModel() {}
private:
_Ty factory;
};
std::shared_ptr<FactoryConcept> factory;
public:
template< typename _Ty > FactoryContainer(const _Ty& _factory) :
factory(new FactoryModel<_Ty>(_factory)) {}
};
:これまでのところ、私は考え出した私は、私が思いついたいくつかの並べ替えの含むタイプのベクトルまたはリストが必要、
template<typename _Ty> bool isType(){...}
の線に沿って何かが、私はそれを実装する方法まったくアイデアを持っていない、または私も型消去を使用した後のタイプを決定するとそこに右のトラックにしています。
EDIT: これはXYの問題であるとの複数のコメントの後、私は自分が行っていることを再強調することに決めました。
私は、Factory型(すべてのインスタンス化された任意のテンプレート型を含む)のstlコンテナを持ち、テンプレート型から1つを抜き出すことができます。 私はこれを行うには(が最良の方法ではないかもしれません)型のカプセル化コンテナクラスを使用して、含まれている型が指定されたテンプレート型を使用している場合に応答できるようにしてください。そうでない場合は、あきらめてください。私はそれを把握しようとしているときのようにdynamic_castを示唆するように使用することはできません。どちらの型へのポインタもありません。私は今typeidを調べていて、それが私の問題を解決することを願っていますが、私はまだ別の可能な答えを待っています。
EDIT 2: いくつかの回答をした後、私の要件を満たしているものは何も見つかりませんでした。
基本クラステンプレート:
template<typename FactoryType>
class Factory
{
public:
virtual std::shared_ptr<FactoryType> Create() = 0;
virtual ~Factory(){}
};
工場長クラス:ここで一言で言えば要件だ
class Manager
{
static std::shared_ptr<Manager> singleton;
public:
static std::shared_ptr<Manager> getInstance()
{
if (!singleton) singleton = shared_ptr<Manager>(new Manager);
return singleton;
}
template<typename FactoryType>
Factory<FactoryType>& getFactory()
{
//Pick a factory here by the type and return it by reference
//life cycle is handled by the manager
}
};
Managerは、コアの実行可能ファイルの両方で、さまざまなDLLは約知られているであろう。ファクトリの可能な型は、Managerがコンパイルされた時点では認識されず、互いに知り合わないコードによって参照されます。おそらく、おそらく、ここに工場が入っていて、私が知りませんが、それらの多くが他の誰かによって作られていて、dllを入れていることがあります。
C++では先頭のアンダースコア( '_')を使用しないでください。コードが濁ってしまい、多くの場合、言語によって予約されています。 –
文法的な発言:できれば 'unique_ptr'を返し、' shared_ptr'は返せません。前者はコールサイトで後者にバインドすることができます。 –
C++は、.NET言語とは異なり、反射のサポートが非常に貧弱です。あなたの実際のユースケースは何ですか? –