美文网首页C++\CLI
C++/CLI中小心得 之一

C++/CLI中小心得 之一

作者: 左图右码 | 来源:发表于2022-06-18 11:53 被阅读0次

大部分人用C++/CLI都是为了包装,甚至有人说用托管C++的时候充满了噪音,什么时候要用pin_ptr,什么时候用interor_ptr,什么时候value class,什么时候ref class,用prediction的时候还不能用lambda,在managed code来用不了lambda,new/gcnew,&和%,*和^...有没有带着镣铐跳舞的感觉?
如果这叫噪音的话,是不是因为我们一直被人过分地照顾所致?
在此,分享几个tips,让我们逐渐去除编程语言中的那些噪音.

typeof

csharp中有个typeof,c++/cli则没有,只有一个typeid,而且是被智能提示所忽略.
比如:

Type^ t0 = int::typeid;
...
ref class people
{}
Type^ t1 = people::typeid;

不仅基础类型,而且可以是自定义类型.
定义如下模版,可以模拟出类似C#中的typeof:

template<typename T>
inline System::Type^ typeof() { return T::typeid; }

template<typename T>
inline System::Type^ typeof(T t) { return T::typeid; }

可以用handle实例来取得Type:

JiaoAnDataBag^ hdl = nullptr;
System::Console::WriteLine(typeof(hdl));
System::Console::WriteLine(typeof<JiaoAnDataBag>()->FullName);

从实例得到Type^,不能用->,因为实例可能是无效的空handle,但利用模版则可以,如

JiaoAnDataBag^ hdl = nullptr;
Type^ t = hdl->GetType();  //crash

从列表初始化CLI容器

在C#中,从列表可以初始化为CLI容器:

var arr =new List<int>{1,2,3,4};

但在C++/CLI中,花括号代表为native中的初始化列表.对应于std::initializer_list,这是一个native class,在List<T>里没有这个构造函数.不得不gcnew List<T>以后,通过Add加入到集合.
下面这个辅助函数可以做到类似的效果:

template<typename T>
auto ArrayToList(... cli::array<T>^ arr)
{
    auto ret = gcnew List<T>;
    for each(auto cur in arr)
    {
        ret->Add(cur);
    }
    return ret;
}
//使用方法
List<int>^ arr = ArrayToList(1,2,3,4);

考虑到扩展,可以增加类型:

template<typename T,typename Coll_t = System::Collections::Generic::List<T>>
auto ArrayToList(... cli::array<T>^ arr)
{
    auto ret = gcnew Coll_t;
    for each(auto cur in arr)
    {
        ret->Add(cur);
    }
    return ret;
}

是不是有点殊途同归的味道了.你还可以享受自己造轮子的乐趣.犹如智力游戏.

void foo(List<people^>^ peoples)
{
 ...
}
people^ p0 = ...;
people^ p1 = ...;
people^ p2 = ...;
foo(ArrayToList(p0,p1,p2));

请享用!

相关文章

  • C++/CLI中小心得 之一

    大部分人用C++/CLI都是为了包装,甚至有人说用托管C++的时候充满了噪音,什么时候要用pin_ptr,什么时候...

  • C++\CLI中的lambda表达式

    可以在C++\CLI中使用lambda表达式,但有一个限制,不能捕获C++\CLI托管类型,只能捕获C++的基本类...

  • 跨越语言的障碍:C++/CLI 调用 C#

    跨越语言的障碍:C++/CLI 调用 C#

  • 关于C++\CLI的迟到的开宗明义的解释1

    在发出几篇C++\CLI接几篇学习记录后,我觉得少了一个前奏,需要开宗明义地对C++\CLI做一个解释。虽然C++...

  • Visual C++下创建WPF项目的方法探索

    C++/CLI下创建WPF项目的方法 由于WPF不仅仅支持C#/VB开发,还支持其他语言,比如: C++、F#等开...

  • C#与C/C++的交互

    C#与C++交互,总体来说可以有两种方法: 利用C++/CLI作为代理中间层 利用PInvoke实现直接调用 第一...

  • C++/CLI中的确定性垃圾回收与mdl.net中Element

    C++/CLI中的确定性垃圾回收 托管语言中自动垃圾回收导致回收的时机是不确定的,只有托管C++实现了确定性的回收...

  • C++/CLI使用WindowsAPI

    首先肯定要加#pragma comment(lib, "User32.lib")这句。 然后我又碰到了LINK的错...

  • C++\CLI混合编程

    如何创建Unsafe代码 如前所述,不安全代码通常是通过向托管代码中添加本机代码来创建的。通过使用不安全的操作或对...

  • 心得之一

    在这疫情时刻,就连有钱人家都在说,现在时期,不好挣,能省则省…… 通过各种渠道,各种方法,不断地寻找,事业、感情、...

网友评论

    本文标题:C++/CLI中小心得 之一

    本文链接:https://www.haomeiwen.com/subject/iymkvrtx.html