私は現在、レガシー (C++) ORB を適応させるための [OMG13] (以下) 準拠の C++11 部分ファサードに取り組んでいます。サーバー側、DII、OBV などがないという意味での「部分的」 - したがって、非常に基本的なもののみです。
[OMG13] has in 6.25.6 Inheritance-Based Interface Implementation
実装は、OMG IDL インターフェイス定義に基づいて生成された基本クラスから派生する必要があります。生成された基本クラスはスケルトン クラスと呼ばれ、派生クラスは実装クラスと呼ばれます。インターフェイスの各操作には、スケルトン クラスで宣言された対応する仮想メンバー関数があります。
[強調鉱山]
文字どおりに解釈すると、idl で定義されたインターフェイス A の場合、A_impl は A_skel の子孫でなければならないことを意味します。
class A_impl : /* whatever, likely public */ A_skel {
/**/
};
しかし、6.25.6で与えられたスニペットはそうではないことを示しています
// C++
class A_skel : public virtual CORBA::servant_traits<A>::base_type { ... };
// C++
class A_impl: public virtual CORBA::servant_traits<A>::base_type { ... };
したがって、スニペットによると、A_impl と A_skel は兄弟であり、同じ祖先から派生しています。
前者の標準、C++11 より前の C++、マッピング [OMG12] には5.40.3継承ベースのインターフェイス実装があるため、何をすべきかを決定するのは簡単ではありません。
実装クラスは、OMG IDL インターフェイス定義に基づいて生成された基本クラスから派生できます。生成された基本クラスはスケルトン クラスと呼ばれ、派生クラスは実装クラスと呼ばれます。
したがって、C++ では、C++11 より前のマッピングでは「できる」ではなく「しなければならない」ではなく、で指定されたスニペットはこの「できる」と一致しています。
class POA_A : public virtual PortableServer::ServantBase
{
/* [...] */
}
/* [...] */
class A_impl : public POA_A
{
/* [...] */
};
そしてそれは、私が取り組んでいる従来の ORB のインフラストラクチャが構築されているものでもあります ([OMG12] 準拠の委任ベースの実装も提供することは別として)。
では、私の小さな C++11 準拠の ORB ファサードで _skel と _impl を関連付けて [OMG13] に準拠し、[OMG13] のその部分のリファクタリングの可能性に対して impl コードを強化するにはどうすればよいでしょうか?
たとえば、CRTP スタイルの継承多重化クラスから _impls を派生させることを検討できます。
struct Snippet_Reading{};
struct Prose_Reading{};
namespace mock {
class IA{};
// impl specific, not important here
template<class Ifc>
struct LoremIpsum {};
template<class Ifc>
class POA_Delegator {
// impl specific, not important here
};
namespace CORBA {
template<class Ifc>
struct servant_traits {
/// @TODO meditate how to implement that
typedef LoremIpsum<Ifc> base_type;
};
}
}
namespace detail {
using namespace mock;
template<typename Reading, class Ifc>
class Base {};
template<class Ifc>
class Base<Prose_Reading, Ifc> : public virtual POA_Delegator<Ifc> {};
template<class Ifc>
class Base<Snippet_Reading, Ifc> : public virtual CORBA::servant_traits<Ifc>::base_type {};
}
#if defined(PROSE_READING)
template <class Ifc>
using Base = detail::Base<Prose_Reading, Ifc>;
#elif defined(SNIPPET_READING)
template <class Ifc>
using Base = detail::Base<Snippet_Reading, Ifc>;
#else
#error Oh My Goodness! Don't know how to interpret OMG's IDL to C++11 Mapping!
#endif
class IA_impl : public virtual Base<mock::IA> {};
int main() {}
しかし、これは正確に標準準拠の実装者のインターフェースを生み出すわけではありません。
参考文献
[OMG12] OMG C++ 言語マッピング。OMG、2012年。http://www.omg.org/spec/CPP/1.3
[OMG13] OMG。C++11 言語マッピング。OMG、2013年。http://www.omg.org/spec/CPP11/