2014-10-08 61 views
0

我怎样才能做到这一点比较容易的方式:C++参数支持字符串和整数的结构?

是不是有“无功”,在C++像.NET?我需要参数才能成为整数和字符串。

+3

C#的'var'就像'auto'。这并不意味着变体。使用'boost :: variant'。 – chris 2014-10-08 23:00:38

+1

C++本身不支持“此类型可以是多种类型”。有一些模板库晚餐,比如'boost :: variant'。可能无论它应该是一个模板,例如 – 2014-10-08 23:01:03

+0

。函数模板 – 2014-10-08 23:08:05

回答

0

你在C++中有'auto'这个关键字,但是它在C++ 0x和C++ 1x上,它是编译器,它决定了类型,编译后它不能改变。

你可能寻找类似的boost ::变种:http://www.boost.org/doc/libs/1_56_0/doc/html/variant.html

+0

但它不适用于声明结构! ;) – 2014-10-08 23:05:39

+0

它与对象一起工作,对迭代器非常有用:http://www.informit.com/articles/article.aspx?p=1848529 – Marchah 2014-10-08 23:10:12

+0

这与上述评论完全无关。 – chris 2014-10-08 23:15:41

0

您可以使用Union,但你仍然需要知道你指定什么类型的编译时间。您可以通过使用带有隐式键入的模板来分配值来隐藏这一点,但在读取值时仍需知道适当的类型。不知道这将是多么有用。

你也可以使用多态性和你自己的(模板)包装类代替内置类型。

0

我建议你把通用代码分解出来并设置为使用工厂。

使用工厂
的问题是,你不知道参数的类型,直到您解析字符串。最好的方法是将所有东西都保存为一个字符串或创建一个Factory并使用一个基类。有关更多研究,请参阅“C++工厂设计模式示例”。

struct Base_Parameter 
{ 
    std::string& parameter_as_string; 
    virtual void extract_parameter(const std::string& parameter_string) = 0; 
}; 

struct Int_Parameter : public Base_Parameter 
{ 
    int parameter_value; 
    void extract_parameter(const std::string& parameter_string) 
    { 
    std::istringstream param_stream(parameter_string); 
    param_stream >> parameter_value; 
    } 
} 

你的参数“表”是,要么指向基类(如果类型未知),或者你可以有后代结构的容器的容器:

struct Parameter_Container 
{ 
    std::vector<Int_Parameter> parameters; 
}; 

至于工厂,工厂将是一个可以根据某些标准创建参数对象的对象。它会返回一个指向基类的指针。

注意:除非您处于严格受限的平台(如嵌入式系统),否则不要担心重叠的内存位置以节省空间。