我在 C++ 头文件中有以下类继承模式。
class Base{
public:
virtual ~Base() = default;
};
template<class T> class Container : public Base{
public:
~Container () override = default;
// The rest of implementations
};
我已将基类导出到 C#,并希望为实现 IEnumerable 的 Container 创建一个 C# 接口。从documentation看来我需要使用csinterfaces_衍生。我无法让它与以下模式一起工作。即使我交换以下两行的顺序,IEnumerable 也会丢失。有什么建议吗?
%typemap(csinterface_derived) Container<int> “IEnumerable<int>";
%template (ContainerOfInt) Container<int>;
%typemap(csinterface_derived)
有错别字。
应该是%typemap(csinterface
s_derived)
此外,即使
Container<T>
模板类碰巧继承自另一个基类,如果注入实际的 C# 自定义代码(通过 %typemap(cscode)
,通过神奇命名的方法 IEnumerable<T>
实现 public System.Collections.Generic.IEnumerator<T> GetEnumerator()
,那么一个不需要显式影响/影响生成的 SWIG C# 类包装器的继承,即不需要显式指示 IEnumerable
或 IEnumerable<T>
作为继承/实现的 C# 接口。在这种情况下,使用 %typemap(csinterface
s )
也应该有效。
但是,如果希望让 SWIG C# 类包装器实现其他常用的 C# 接口(例如
System.IDisposable
),那么必须使用 csinterfaces_derived
。
不知何故,SWIG 的 Cpp-to-
someOtherSupportedPgmLang
实现部分似乎不如 Java-to_someOtherSupportedPgmLang
灵活。从某种意义上说,对于源 lang = C++,词法分析器和语法/解析器更加复杂,因此 SWIG 需要明确知道是否希望将更多基类/接口附加到目标 C++ 类的继承链。可能是因为它会产生额外的、更耗时的逻辑,以找出现有的 C++ 基类、它们的定义在哪里、正确的继承顺序等,然后添加新的基类型名称。