C++ 在c+中强制类继承+;11对于包装类——这是一件坏事吗?

C++ 在c+中强制类继承+;11对于包装类——这是一件坏事吗?,c++,c++11,multiple-inheritance,word-wrap,C++,C++11,Multiple Inheritance,Word Wrap,我一直在为脚本语言编写包装库(部分是为了学习c++11特性,部分是为了满足特定需要)。出现的一个问题是将继承的对象导出到脚本语言 问题涉及使用包装类的代理对象调用函数。具体地说,如果函数采用Foo*,那么无论使用何种脚本语言,都必须适当地强制转换对象代理 有两种方法(我可以想到)可以对对象代理进行适当的建模: template <class T> struct ObjectProxy { T *ptr; }; 对于用户来说,这确实会让事情变得不那么无缝(尽管我一直在寻找实现自

我一直在为脚本语言编写包装库(部分是为了学习c++11特性,部分是为了满足特定需要)。出现的一个问题是将继承的对象导出到脚本语言

问题涉及使用包装类的代理对象调用函数。具体地说,如果函数采用
Foo*
,那么无论使用何种脚本语言,都必须适当地强制转换对象代理

有两种方法(我可以想到)可以对对象代理进行适当的建模:

template <class T>
struct ObjectProxy {
   T *ptr;
};
对于用户来说,这确实会让事情变得不那么无缝(尽管我一直在寻找实现自动化的方法),但这确实意味着您可以依赖内置的dynamic_cast,而不必编写自己的变体

编辑


添加了
castAs()
以使用例更清晰

您的问题听起来像是设计用来解决的。该解决方案基本上结合了您的两个想法:(未经测试的代码)

struct ObjectProxyBase{
虚拟~ObjectProxyBase(){}
};
模板
结构ObjectProxy:公共ObjectProxyBase{
T*ptr;
};
模板
T*proxy_cast(ObjectProxyBase*obj){
自动ptr=动态铸轧(obj);
如果(!ptr)
返回空ptr;
返回ptr->ptr;
}

除非
WrappedClass
至少有一个虚拟函数(例如
public:virtual~WrappedClass()=0;
),否则不能使用
dynamic\u cast
。你是对的。我在尝试简化时忽略了这一点。修正问题。不幸的是,这行不通。问题是,从ObjectProxy到ObjectProxy的动态转换将失败,即使A从B继承(如果需要,我可以发布示例代码)。我尝试过使用
boost::any
,但问题是它只有一个
static\u cast
。有人制作了一个动态播放的版本,但我无法让它工作。
struct WrappedClass {
  virtual ~WrappedClass() {}
};

struct ObjectProxy {
  WrappedClass *ptr;

  template <typename T>
  boost::shared_ptr<T> castAs() {
    return boost::dynamic_pointer_cast<T>(instance);
  }
};
class FooWrapped: public Foo, public WrappedClass {};
struct ObjectProxyBase {
  virtual ~ObjectProxyBase() {}
};

template <class T>
struct ObjectProxy : public ObjectProxyBase {
   T *ptr;
};

template <class T>
T *proxy_cast(ObjectProxyBase *obj) {
    auto ptr = dynamic_cast<ObjectProxy<T> *>(obj);
    if (!ptr)
        return nullptr;

    return ptr->ptr;
}