我想编写一个返回std :: set自定义对象的(C ++)方法。但是,我不想暴露插入对象时使用的比较器,因此我将其设为私有类。 我创建这样的集合:
std::set<some_class, some_class_comparator> return_object;
现在我想返回集合,所以它必须像这样(在返回时隐式):
(const std::set<some_class>) return_object;
这是编译器抱怨的地方。有没有办法将带有比较器的可变集转换为不可变的<?p>
非常感谢,
霍尔格
答案 0 :(得分:4)
有没有办法施放一个可变的集合 与比较器到一个不可变的 无?
不,因为
std::set<some_class, some_class_comparator>
和
std::set<some_class>
完全是不同的,不相关的类型。模板只是模板 - 一种指定在编译之前如何生成类型的方法。在第二种情况下,比较器是std :: set随附的默认比较器。
有没有令人信服的理由some_class_comparotor需要私密?它可能是它自己的独立实体吗?是不是只是你不想污染你班级的公共界面?
答案 1 :(得分:1)
我不这么认为。 AFAIK std::set<some_class>
只是std::set<some_class, std::less<some_class> >
的简写,因此无法根据需要转换该集。
我建议将这些项目转移到其他数据结构(例如矢量)中,该数据结构将保持当前项目的顺序而不需要比较器。
答案 2 :(得分:1)
您最好的解决方案是这样的:
class MyClass
{
class some_class_comparator;
public:
typedef std::set<int, some_class_comparator> ReturnSet;
ReturnSet myMethod();
// ...
private:
class some_class_comparator
{
public:
bool operator< (MyClass& m) {return true;}
};
};
//later...
MyClass::ReturnSet s = my_class_instance.myMethod();
答案 3 :(得分:0)
这是两种不同的类型std ::&lt;类型,比较器&gt;和std :: set&lt;类型,DefaultComparator&gt;。
答案 4 :(得分:0)
您希望隐藏来自调用者的实现细节,这听起来像虚拟函数,听起来像模板。我想首先,你需要问问自己,这真的很重要吗?如果是这样,请将您的类隐藏在IOpaqueSet接口后面。当然,没有其他STL操作可以对它起作用。
答案 5 :(得分:0)
STL带有许多内置类,但它也是一个可扩展的框架。如果定义了:: own :: immutable_set,并且定义了迭代器,则其他STL算法可以使用它。 immutable_set<T>
将被定义为围绕可变std::set<T, comparator<T> >
的精简const包装器(支持不同比较器所需的一些模板魔法,因为它们导致不同的类型)。 immutable_set<T>::iterator::operator++
会转发std::set<T>::iterator::operator++
等。