[英]Is there a clean way to convert a C# 'params object[]' constructor argument into a C++ constructor?
我正在嘗試將一些舊代碼從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 ++中是否有任何方法可以在此處達到相同的結果? 也就是說,在構造函數中接受從無到大量的任意數量的字符串參數,並將它們存儲在列表/向量中?
我覺得針對不同長度的命令字符串的多個構造函數可能會起作用,但這並不能解決輸入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#代碼更緊密地匹配,但事實並非如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.