我有一个类Id
,用于标识自定义容器中的元素,但希望能够使用Id
索引到不相关的随机访问容器(例如,std::vector
) 。 Id
有一个定义良好的索引映射,因此最简单的解决方案是将转换运算符添加到size_t
,这将允许以下语法:
Id id;
std::vector<int> array;
...
array[id] = 42;
我并非真的希望Id
通常可以转换为size_t
,但我只是希望能够将其用于索引到其他容器。
我已经提出以下备选方案
// Same problem as above, although a bit more explicit:
array[id.toIndex()] = 42;
// Accomplishes what I want, but seems a bit backwards:
id.indexInto(array) = 42;
id[array] = 42;
还有哪些其他模式可供这种用途?或者我应该只使用上述其中一项或Id
可转换为size_t
?
答案 0 :(得分:1)
您有三种选择:
operator std::size_t()
explicit operator std::size_t()
明确转换,允许std::size_t(id)
和static_cast<std::size_t>(id)
access
,该朋友是Id
的朋友,可以使用operator[]
版本std::size_t
醇>
在前三种情况下,您Id
将始终隐式或明确地转换为std::size_t
。在最后一种情况下,您只能在您指定的函数中进行转换。
最后一个例子是:
class Id {
public:
Id(std::size_t id) : inner(id) {}
template<typename Container>
friend typename Container::value_type& access(Container& container, Id index) {
return container[index.inner];
}
private:
std::size_t inner;
};
然后用作:
auto ix = Id(2);
std::vector<int> vector{1, 2, 3, 4};
std::cout << access(vector, ix);
答案 1 :(得分:0)
使用像@Override
public void doubleClick(final DoubleClickEvent event)
{
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
if (selection == null || selection.isEmpty())
return;
Object sel = selection.getFirstElement();
// TODO 'sel' is the object from your content provider
}
这样的东西似乎很好。从设计角度来看,你真的想使用矢量吗? toIndex()
是你真正想要在这里使用的。像
std::map
您需要在Id类中实现比较运算符(小于运算符)才能使其正常工作。
我不能说这符合你的要求。