ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 泛型/多态迭代器

2019-08-30 08:04:41  阅读:137  来源: 互联网

标签:c containers iterator stl


实现getIterator的最佳方法是什么?根据条件,我想返回相应的迭代器.

// global variables
vector<int> myVector;
set<int> mySet;

vector<int>/set<int>::iterator getIterator(bool someCondition) {
    if (someCondition) return mySet.begin();
    else return myVector.begin();
}

请反对“不要使用全局变量”等“明智”的回答.我只是想知道是否有一种方法来“概括”set和vector迭代器,这个例子只是为了简单起见.

干杯

解决方法:

简短的回答是,你做不到. C是一种静态类型的语言.这意味着函数的类型或方法的返回值是在编译时声明的,而不是在运行时声明的.

其他语言,例如Perl,是动态类型的. Perl函数有时可以返回标量值,如整数.其他时候它可以返回引用(指针),列表或散列(std :: vector或std :: map).但是C不会这样.

因此,如果您需要编写动态类型的代码,则需要使用除C之外的其他语言.

你可以在这里做的唯一事情就是在C中声明这个函数返回一些可以转换为任何一个的类型.

例如:

class return_value {

public:

    enum { vector, set} type_t;

    type_t type;

    std::vector<int>::iterator v_iter;
    std::set<int>::iterator s_iter;
};

return_value getIterator(bool someCondition) {
    // ...
}

然后你的getIterator()函数将构造一个return_value实例,初始化其v_iter或s_iter成员,并将其类型成员初始化为return_value :: vector或return_value :: set,以便getIterator()的调用者可以检查返回值,并确定返回什么类型的迭代器.

不同的方法也是可能的.例如,如果可以根据getIterator()的参数确定返回值的类型,则可以使用模板和特化来实现静态类型的解决方案.

标签:c,containers,iterator,stl
来源: https://codeday.me/bug/20190830/1766771.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有