(重新)命名 std::pair 成员

新手上路,请多包涵

而不是写 town->first 我想写 town->name 。内联命名访问器( 重命名映射迭代器的第一个和第二个 以及 命名 std::pair 成员)是我迄今为止找到的最佳解决方案。我对命名访问器的问题是失去类型安全性: pair<int,double> 可能指的是 struct { int index; double value; }struct { int population; double avg_temp; } 。谁能提出一个简单的方法,也许类似于特征?

我经常想从一个函数返回一对或一个元组,每次引入一个新的类型,比如 struct city { string name; int zipcode; } 和它的 ctor 是很累人的。我很高兴了解 boost 和 C++0x,但我需要一个没有 boost 的纯 C++03 解决方案。

更新

关于 andrewdski 的问题:是的,像 pair<int=index, double=value> 这样的(假设的)语法会创建一个与 pair<int=population, double=avg_temp> 不同的类型,可以满足您的要求。我什至不介意必须实现自定义对/元组模板类 ONCE 并在需要新类型时适当地将“名称特征”模板参数传递给它。我不知道“名字特征”会是什么样子。也许这是不可能的。

原文由 Ali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 709
1 个回答

我看不出你怎么可能做得比

struct city { string name; int zipcode; };

那里没有什么是不必要的。您需要两个成员的类型,您的整个问题都围绕着为两个成员命名,并且您希望它是唯一的类型。

你知道聚合初始化语法,对吧?您不需要构造函数或析构函数,编译器提供的就可以了。

示例:http: //ideone.com/IPCuw


类型安全要求您引入新类型,否则 pair<string, int> 在 (name, zipcode) 和 (population, temp) 之间是不明确的。

在 C++03 中,返回一个新元组需要:

 city retval = { "name", zipcode };
return retval;

或编写一个方便的构造函数:

 city::city( std::string newName, int newZip ) : name(newName), zipcode(newZip) {}

要得到

return city("name", zipcode);

但是,使用 C++0x,您将可以编写

return { "name", zipcode };

并且不需要用户定义的构造函数。

原文由 Ben Voigt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题