首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单个C++/CLI方法封装多个类型特定的C函数

单个C++/CLI方法封装多个类型特定的C函数
EN

Stack Overflow用户
提问于 2011-01-06 14:28:30
回答 3查看 864关注 0票数 2

我正在使用C++/CLI包装一个C库,这样C库就可以轻松地从C#以C#'ish的方式使用。

这个库中的一些函数用于将值放入容器中。C中没有泛型,因此每种类型都存在一个函数CLIB_SetBool(BOOL值)、CLIB_SetInt(int值)、CLIB_SetString(char* string)等等。

为了更容易地从C#中使用,我创建了一个使用System::Object的集合函数。

我有两个相关的问题:

使用我的方法,

  1. 如何在System::Object类型上使用开关语句来调用正确的CLIB_Setxxxx函数。typeid只适用于非托管代码,我似乎不能使用GetType。
  2. 有更好的方法来包装这些函数,比如使用泛型吗?我开始使用模板专门化,但后来意识到C#没有看到模板。

谢谢。

编辑

如何实现void (System::Object^ value)?

我想做这样的事情:

代码语言:javascript
复制
void MyWrapper::Set(System::Object^ value)
{
 switch(typeid(value))
  {
   case System::Int32:  CLIB_SetInt(MyMarshal<clib_int>(value));    break;
   case System::Double: CLIB_SetInt(MyMarshal<clib_double>(value)); break;
//and so on
}
}

对于托管代码,typeid失败,显然这些情况无效。怎么修?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-06 15:29:30

我不能使用开关,因为在C++中,托管代码似乎没有一个完整的类型表示。

下面的工作。

代码语言:javascript
复制
void MyWrapper::Set(System::Object^ value)
{
  if (value->GetType() == System::Int32::typeid)
  {
      CLIB_SetInt(MyMarshal<clib_int>(value));
  }  
  else if ((value->GetType() == System::Double::typeid)
  {
      CLIB_SetDouble(MyMarshal<clib_double>(value));
  }
//etc
}
票数 1
EN

Stack Overflow用户

发布于 2011-01-06 14:37:44

您可能比使用按类型键的委托字典更糟糕(抱歉,C#语法,我已经有一段时间没有使用C++/CLI了)。当然,在每个委托中,您对适当的C函数进行实际调用。

代码语言:javascript
复制
public delegate void CLIBDelegate(object);


// handlers for types that will call the appropriate CLIB_XXX function:
public void CLIB_int(object _obj);
public void CLIB_string(object _obj);
// etc...


// Our dictionary:
Dictionary<System.Type, CLIBDelegate> dict = new Dictionary<System.Type, CLIBDelegate>();
dict[typeof(System.Int32)] = CLIB_int;
dict[typeof(System.string] = CLIB_string;
// etc...


// your set function
void Set(Object _object)
{
    if(dict.ContainsKey(_object.GetType())
        dict[_object.GetType()](_object);
} // eo Set
票数 2
EN

Stack Overflow用户

发布于 2011-01-06 14:50:57

以下几个过载如何?

代码语言:javascript
复制
ref class CLIB_Wrapper
{
    static void Set(System::Boolean^ value) { CLIB_SetBool(*value); }
    static void Set(System::Int32^ value) { CLIB_SetInt(*value); }
    static void Set(System::String^ value) { CLIB_SetString(*value); }

    static void Set(System::Object^ value)
    {
        System::Type^ type = value->GetType();
        if( type == System::Boolean::typeid )
        {
            Set((System::Boolean^)value);
        }
        else if( type == System::Int32::typeid )
        {
            Set((System::Int32^)value);
        }
        else if( type == System::String::typeid )
        {
            Set((System::String^)value);
        }
    }
};

显然,您需要对字符串-> char*转换进行适当的编组,但您了解了这一点。

编辑以包括类型的检测

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4615954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档