有没有一种干净的方法可以将 C# 'params object[]' 构造函数参数转换为C++构造函数?

Is there a clean way to convert a C# 'params object[]' constructor argument into a C++ constructor?

本文关键字:构造函数 params C++ object 参数 转换 一种 方法 有没有      更新时间:2023-10-16

我正试图将一些旧代码从C#移植到C++,我需要知道是否有一种有效/干净的方法可以将接受params对象[]参数的C#构造函数转换到C++。

在我的例子中,我有以下简单的构造函数:

    public ParameterDescriptor(bool required, ParameterType parameterType, params object[] values)
    {
        this.optional = optional;
        this.parameterType = parameterType;
        this.defaultValues.AddRange(values);
    }

其中,输入第三个参数的值可以从绝对空白到任意数量的命令字符串,即"ON"、"OFF"、"RESET"。然后,这些命令字符串通过以下方式添加到包含每个对象值的列表中:

    List<object> defaultValues = new List<object>();
    public List<object> DefaultValues
    {
        get { return this.defaultValues; }
        set { this.defaultValues = value; }
    }

C++中是否有任何方法可以在这里获得相同的结果?也就是说,在构造函数中接受从None到大量的任意数量的字符串参数,并将它们存储在列表/向量中?

我觉得为不同长度的命令字符串使用多个构造函数是可行的,但这并不能解决输入未知X数量字符串的可能性。我觉得va_args可能是正确的,但它们似乎是一个非常混乱的解决方案。什么在这里最有效?

std::vector正是您想要的。由于C++11,它无论如何都可以更容易地初始化:

std::vector<int> v = { 1, 2, 3 };

然而,更困难的问题是如何最好地翻译C#object。C++没有任何类型的根类。没有object这回事。

有时,一个好的C++替代方案是使用模板。这里有一个例子,其中我还使用了一个正确的C++初始化列表,而不是赋值,以及const正确性:

template <class T>
class ParameterDescriptor
{
    bool required;
    ParameterType parameterType;
    std::vector<T> defaultValues;
    // ...
    ParameterDescriptor(bool required, ParameterType const& parameterType, std::vector<T> const& values) :
        required(required),
        parameterType(paremeterType),
        defaultValues(values)
    { 
    }
    void setDefaultValues(std::vector<T> const& values)
    {
        defaultValues = values;
    }
    std::vector<T> getDefaultValues() const
    {
        return defaultValues;
    }
};

但这实际上取决于您为什么首先在C#中使用object。关键是,无论是否使用模板,std::vector在这里都是正确的选择。

你很可能正在寻找类似boost::any的东西。然后您可以使用std::vector<boost::any>

我觉得va_args可能是对的,但他们似乎就像一个非常混乱的解决方案。

va_args将是一个可怕的解决方案。甚至不要考虑使用它。还要远离原始数组。它们在语法上的相似性,用[]表示法声明,可能会欺骗你,让你相信它们与C#代码匹配得更紧密,但事实并非如此。