我有2个不同类型的容器,我需要比较各种类型。
代码示例:
class A{
private:
std::list<Course*> courses;
};
std::list
就是一个例子,它可以是std::vector
因此我尝试这样做if
:
if (typeid(courses) == std::list){
//do something...
}
else{
//do...
}
这不是我猜的正确方法.. 我该如何解决这个问题? 感谢。
答案 0 :(得分:0)
我希望我能理解你的要求。
通常,如果您的代码要求您执行类型转换或类型比较,则表明存在设计问题。
您可以通过使用通用代码来解决这个问题,该代码尽可能少地对代码做出假设。为此,请在std(std :: begin,std :: end)和泛型算法中使用通用容器适配器(请参阅std :: find,std :: accumulate,std :: for_each,std :: transform)。
您还可以typedef
数据类型,并根据typedef(及相关类型)编写所有内容。
示例:
class A{
typedef std::list<Course*> courseptr_sequence; // consider
// either shared_ptr or unique_ptr instead of raw*
courseptr_sequence courses;
public:
// an advanced course is - for this example
// a course where Course::advanced() evaluates to true
void find_advanced_courses(std::ostream& out) const
{
auto advanced = std::find_if(std::begin(courses), std::end(courses),
[](Course* p){ return p->advanced(); });
if(advanced != std::end(courses))
out << *(*advanced);
}
};
通过这种实现,您可以在typedef中更改容器类型,其余的将编译好。
编辑:如果你的问题是两个不同的容器类型,你比较相应位置的元素(元素有不同的类型),答案是使用std :: equal和自定义比较函子。
修改(请参阅reference1和reference2):
template <class N>
struct is_list { static const int value = 0; };
template <class N, class A>
struct is_list<std::list<N, A> > { static const int value = 1; };
template <typename T> using negate = std::integral_constant<bool, !T::value>;
template<typename C>
void user3630497_sort(std::enable_if<
negate<is_list<C>::value>::value, C>::type& container)
{
std::sort(std::begin(container), std::end(container));
}
template<typename C>
void user3630497_sort(std::enable_if<
is_list<C>::value, C>::type& container)
{
container.sort();
}
用法:
std::list<Course*> l;
user3630497_sort(l);
std::vector<Course*> v;
user3630497_sort(l);