C++ cli 如何创建包含按值传递的列表(或类似列表)的CLI值类? 我们有一个C++库,它使用一个包含STL结构向量的结构,比如: struct Params { // values... } struct Settings { std::vector<Params> m_params; // values... } public value struct Params { // values... } public value struct Settings { List<Params>^ Params; // values... } struct参数 { //价值观。。。 } 结构设置 { std::向量m_参数; //价值观。。。 }

C++ cli 如何创建包含按值传递的列表(或类似列表)的CLI值类? 我们有一个C++库,它使用一个包含STL结构向量的结构,比如: struct Params { // values... } struct Settings { std::vector<Params> m_params; // values... } public value struct Params { // values... } public value struct Settings { List<Params>^ Params; // values... } struct参数 { //价值观。。。 } 结构设置 { std::向量m_参数; //价值观。。。 },c++-cli,pass-by-reference,pass-by-value,C++ Cli,Pass By Reference,Pass By Value,我正在为库编写一个CLI包装器,并且我想要上述结构类型的等价物。我一直在考虑使用列表作为向量的等价物,如下所示: struct Params { // values... } struct Settings { std::vector<Params> m_params; // values... } public value struct Params { // values... } public value struct Settings

我正在为库编写一个CLI包装器,并且我想要上述结构类型的等价物。我一直在考虑使用列表作为向量的等价物,如下所示:

struct Params
{
    // values...
}

struct Settings
{
    std::vector<Params> m_params;

    // values...
}
public value struct Params
{
    // values...
}

public value struct Settings
{
    List<Params>^ Params;

    // values...
}
公共值结构参数
{
//价值观。。。
}
公共值结构设置
{
列表^Params;
//价值观。。。
}

但由于列表是一种引用类型,所以列表是通过引用而不是值传递的。有没有办法创建一个包含列表(或类似内容)的CLI类,该列表和其他成员一起按值传递?

我认为您不能按值传递设置类,因为“值类型不能包含用户定义的特殊成员函数”(如复制构造函数)

您可以使用以下方法实现类似效果:

public value struct Settings : public ICloneable
{
    List<Params>^ m_params;

    virtual Object^ Clone()
    {
        Settings^ rv = gcnew Settings();
        rv->m_params = gcnew List<Params>();
        rv->m_params->AddRange(m_params->ToArray());
        return rv;
    }
}

几乎与
设置设置1=设置2一样干净通过值传递得到的样式语法。

关于
List^%Params或者<代码>列表^%参数

我同意麦克达夫的回答,这归结为你所问的是不受支持的

我推测,你的主要观点不是获得实际的传递值,而是获得传递值行为。想想
System.String
。这并不是真正的值类型,但您可以安全地传递引用,因为字符串不能修改,只能创建新的字符串


要获得列表的相同属性,可以将
Params
设置为
IList
类型的属性。分配时,将内容复制到新的
列表中
,并存储调用
AsReadOnly()
时得到的
IList
指针。从现在起,
IList
指向一个无法修改的对象。如果结构按值传递,指针将被复制,但这没关系,因为它指向不可变的对象。如果你的对象经常被传递,它也会更快,因为不需要每次都使用deepcopy。

“但是因为
List
是一种值类型”
List
是一种引用类型,而不是值类型。@Mehrdad:很好,谢谢。修正了。你说得很对-字符串等价的行为就足够了。