使用自定义类型

时间:2015-08-07 10:26:55

标签: c++

我有一个类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

2 个答案:

答案 0 :(得分:1)

您有三种选择:

  1. 您在operator std::size_t()
  2. 中声明的隐式转换
  3. 使用explicit operator std::size_t()明确转换,允许std::size_t(id)static_cast<std::size_t>(id)
  4. 自定义专门方法
  5. 拥有自定义功能access,该朋友是Id的朋友,可以使用operator[]版本
  6. 在任何支持它的容器上调用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);
    

    Live demo

答案 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类中实现比较运算符(小于运算符)才能使其正常工作。

我不能说这符合你的要求。