说我有一个结构如下
struct stock{
string ticker;
double price;
double volume;
double eps;
};
如果我想在被要求时输出其中一个变量,例如价格,我是否必须做一个大的 if/else 或 switch 语句来匹配用户输入与成员,或者是否有更优雅的方式来做到这一点,因为我知道stock.userInput
不行。
说我有一个结构如下
struct stock{
string ticker;
double price;
double volume;
double eps;
};
如果我想在被要求时输出其中一个变量,例如价格,我是否必须做一个大的 if/else 或 switch 语句来匹配用户输入与成员,或者是否有更优雅的方式来做到这一点,因为我知道stock.userInput
不行。
struct stock s1;
cout<<" price is:"<< s1.price;
没有特殊的关键字来找到你的变量(对不起打破你的泡沫),你必须使用一个逻辑语句。它会继续:
cout << "What would you like to see? (1)Price (2)etc...etc...";
cin >> input;
switch(input)
{
case 1:
cout << Obj.Price;
break;
case 2:
cout << //....
break;
}
我个人喜欢使用键和 switch 语句,它往往更干净,更容易在程序中稍后返回和修改。
如果你想摆脱大的switch
/if
语句,你可以使用map
withstring
和一个指向成员的指针。假设您的stock
结构,您可以使用:
定义地图(这里是双打)并初始化它:
std::map<std::string,double stock::*> double_members;
double_members["price"]=&stock::price;
double_members["volume"]=&stock::volume;
double_members["eps"]=&stock::eps;
并用它来查找一些值:
stock stock1;
std::string input;
std::cin >> input;
if (double_members.find(input)!=double_members.end())
std::cerr << "Value for " << input << " is: " << stock1.*double_members[input] << std::endl;
else
std::cerr << "There's no field called " << input << std::endl;
它仅限于单一类型,但您不能在运行时使用类似std::cerr << A;
andA
类型的语句来解析。如果您只关心string
(或任何其他,但始终相同)值的表示,那么您可以将map
s 包装在一个类中以搜索所有类型并将转换为 a string
(或其他东西)的值输出。
但是if
声明可能更容易,除非struct
它真的很大。
如果您认为它不适用于 g++ 4.7.1 及更早版本(但适用于 Visual C++ 11.0 及更高版本),那么就像...
#include <sstream> // std::ostringstream
#include <string> // std::string
using namespace std;
struct Stock
{
string ticker;
double price;
double volume;
double eps;
string toString() const
{
ostringstream stream;
stream
<< "Stock("
<< "ticker='" << ticker << "', "
<< "price=" << price << ", "
<< "volume=" << volume << ", "
<< "eps=" << eps
<< ")";
return stream.str();
}
Stock(): ticker(), price(), volume(), eps() {}
};
#include <iostream>
#include <regex>
#include <stdexcept>
#include <stdlib.h>
bool err( string const& s )
{
cerr << "!" << s << endl;
exit( EXIT_FAILURE );
}
string lineFromUser( string const& prompt )
{
string line;
cout << prompt;
getline( cin, line )
|| err( "oh my, failed to read line of input" );
return line;
}
void cppMain()
{
Stock stock;
stock.price = 1.23;
string const s = stock.toString();
cout << s << endl;
string const fieldname = lineFromUser( "Which field u want? " );
regex const valuespec( fieldname + "\\s*\\=\\s*([^,\\)]*)" ); //
smatch what;
if( regex_search( s, what, valuespec ) )
{
cout << "As we all know already, " << what.str() << "." << endl;
}
else
{
cout
<< "!Sorry, there's no field named '"
<< fieldname << "'"
<< endl;
}
}
int main()
{
try
{
cppMain();
return EXIT_SUCCESS;
}
catch( exception const& x )
{
cerr << "!" << x.what() << endl;
}
return EXIT_FAILURE;
}
示例用法:
[d:\开发\测试] > 富 股票(股票代码='',价格=1.23,交易量=0,每股收益=0) 你想要哪个领域?每股收益 众所周知,eps=0。 [d:\开发\测试] > _