我正在尝试将一些旧代码从 C# 移植到 C++,我需要知道是否有一种高效/干净的方法来将采用 params object[] 参数的 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 到大量的任意数量的字符串参数,并将它们存储在列表/vector 中?
我觉得好像针对不同长度的命令字符串的多个构造函数可以工作,但这并不能解决输入未知 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;
}
};
但这真的取决于你为什么使用 object
首先在 C# 中。关键是,std::vector
无论您是否使用模板,这里都是正确的选择。
您可能正在寻找类似 boost::any
的内容.然后你可以使用 std::vector<boost::any>
.
I feel as though va_args might be up the right alley, but they seem like a really messy solution.
va_args
将是一个可怕的解决方案。甚至不要考虑使用它。也远离原始数组。它们的语法相似性,用 []
声明表示法,可能会让您误以为它们更接近 C# 代码,但事实并非如此。
关于c# - 有没有一种干净的方法可以将 C# 'params object[]' 构造函数参数转换为 C++ 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209320/