c – 泛型/多态迭代器

实现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 – 替代std :: map的轻量级STL


下一篇:c-如何定义运算符,以便可以将用户定义类型的数组转换为原始类型的数组?