gpt4 book ai didi

c++ - CORBA/OMG C++11 语言映射

转载 作者:行者123 更新时间:2023-11-28 07:34:56 24 4
gpt4 key购买 nike

我目前正在研究符合 [OMG13](见下文)的 C++11 部分外观,以适应遗留 (C++)ORB; “部分”在服务器端的意义上,没有 DII,没有 OBV 等——因此只有非常基本的东西。

[OMG13] 在 6.25.6 基于继承的接口(interface)实现

Implementation must be derived from a generated base class based on the OMG IDL interface definition. The generated base classes are known as skeleton classes, and the derived classes are known as implementation classes. Each operation of the interface has a corresponding virtual member function declared in the skeleton class.

[强调我的]

如果从字面上看,意味着对于在 idl 中定义的接口(interface) 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 是 sibling ,来自同一祖先。


决定做什么并非易事,因为前者的标准,C++11 之前的 C++,映射 [OMG12],具有 5.40.3 基于继承的接口(interface)实现

Implementation classes can be derived from a generated base class based on the OMG IDL interface definition. The generated base classes are known as skeleton classes, and the derived classes are known as implementation classes.

所以对于C++来说是“可以”而不是“必须”,在C++11之前,映射,给出的片段与这个“可以”一致

class POA_A : public virtual PortableServer::ServantBase 
{
/* [...] */
}

/* [...] */

class A_impl : public POA_A
{
/* [...] */
};

这也是我使用的遗留 ORB 构建基础架构的目的(除了还提供符合 [OMG12] 的基于委托(delegate)的实现)。


那么 - 如何将我的小 c++11 兼容 ORB facade 中的 _skel 和 _impl 关联为 [OMG13] 兼容并强化 impl 代码以防止 [OMG13] 的那部分可能重构?

例如,考虑从 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() {}

但这会产生不完全符合标准的实现者接口(interface)。

引用资料

[OMG12] OMG C++ 语言映射。天哪,2012 年。http://www.omg.org/spec/CPP/1.3

[OMG13] 我的天啊。 C++11 语言映射。天哪,2013 年。http://www.omg.org/spec/CPP11/

最佳答案

CORBA::servant_traits::base_type 应该在编译时解析为 A_skel。用户并没有真正看到 A_skel,那只是一个实现细节。用户定义的 A_impl 而不是仅派生自 CORBA::servant_traits::base_type 特征。

正如您指出的那样,6.26.6 中存在错误。骨架类应该相互派生,而不是从特征派生,所以应该如下所示,也缺少 C_skel。

// C++
class A_skel : public virtual PortableServer::ServantBase {};
class B_skel : public virtual A_skel {};
class C_skel : public virtual A_skel {};
class D_skel : public virtual B_skel, public virtual C_skel {};

对于草案 V1.1 映射,请参阅 http://osportal.remedy.nl .我们也可以协助您应对挑战,请随时直接与我联系。

您能否向 OMG 报告 6.26.2 中示例的正式问题,以便我们可以在规范的 V1.2 版本中解决该问题

关于c++ - CORBA/OMG C++11 语言映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16941484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com