4

我们有一个 C++ 库,它使用一个包含结构体的 STL 向量的结构体,如下所示:

struct Params
{
    // values...
}

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

    // values...
}

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

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

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

    // values...
}

但是由于 List<T> 是引用类型,因此列表是通过引用而不是值传递的。有没有办法创建一个包含按值传递的列表(或类似列表)以及其他成员的 CLI 类?

4

3 回答 3

1

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

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

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;
    }
}

在您的 C# 代码中,您将拥有:

Settings s1, s2;
// ... some code modifying s1
s2 = (Settings)s1.Clone();

Settings settings1 = settings2;这几乎与通过值传递获得的样式语法一样干净。

于 2010-01-20T06:17:41.150 回答
1

我同意 mcdave 的回答,归结为不支持您的要求。

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

要获得相同的列表,您可以创建Paramstype 的属性IList<Param>。分配时,将内容复制到一个新的List<Param>并存储IList调用时获得的指针AsReadOnly()。从现在开始,这些IList点指向一个无法修改的对象。如果结构是按值传递的,则指针将被复制,但这没关系,因为它指向不可变的东西。如果您的对象被大量传递,它也会更快,因为不需要每次都进行深度复制。

于 2010-02-28T15:44:35.180 回答
0

怎么List<Params>^% Params;List<Params%>^% Params;

于 2010-01-25T20:01:18.850 回答