我有一个名为IndexSet的对象,当前定义为std :: vector,我想将其定义为单独的类型.
我希望能够与它进行交互,就好像它是一个向量,但我也想要类型保护,这样当我想使用IndexSet时,我不会意外地使用"普通"向量.
我已经能够提出三种选择,如何做到这一点,没有一个让我高兴.我希望有一个我失踪的第四个.
选项#1:typdef
typdef vector<int> IndexSet
Run Code Online (Sandbox Code Playgroud)
这允许我完全像我的向量一样使用IndexSet,但它给了我零类型保护.我能够将一个向量传递给一个期望一个没有投诉的IndexSet的函数.
选项#2:公共包装类
class IndexSet
{
public:
vector<int> indexes;
};
Run Code Online (Sandbox Code Playgroud)
这将给我类型保护,但它要求我使用与它交互的间接级别.而不是说set.push_back(1); 我不得不说set.indexes.push_back(1);
选项#3:私有包装类
class IndexSet
{
public:
push_back....
operator[]...
etc...
private:
vector<int> indexes
};
Run Code Online (Sandbox Code Playgroud)
这将给我两种类型保护,并允许我直接与IndexSet交互,就好像它是一个向量,但只有我首先为我想要与我的IndexSet一起使用的每个std :: vector方法创建包装器方法.
当然,我真正想要做的是创建一个继承自vector的新类,但它没有自己的实现,但我知道标准库容器不喜欢继承.
我还缺少其他选择吗?
这听起来像是一份工作BOOST_STRONG_TYPEDEF...... http://www.boost.org/doc/libs/1_54_0/boost/serialization/strong_typedef.hpp
BOOST_STRONG_TYPEDEF(std::vector<int>, IndexSet)