可转换类型的C ++括号运算符

时间:2018-09-27 16:19:46

标签: c++ enums operator-overloading

设置。

enum class A { ... };
std::vector<B> bs;
A a = A::foo;
bs[a].bar(); // not going to compile, A isn't an integer

我希望能够编写它,因为它非常方便。我看到的最简单的方法是编写一个自由函数括号重载运算符。

template<class T> inline constexpr
underlying_type_t<T> underlying_cast(T t)
{ return static_cast<underlying_type_t<T>>(t); }

B& operator[](std::vector<B>& b, A a)
{ return b[underlying_cast(a)]; }

这样可能吗?

1 个答案:

答案 0 :(得分:1)

您不能在类定义之外重载operator[]。如果要使用带有枚举A的参数的重载,则必须定义std::vector的子类,并将重载添加到该子类中。

示例:

#include <vector>

template<class Enum, class Val>
class VectorByEnum : public std::vector<Val>
{
public:
    using std::vector<Val>::vector; // inherit constructors

    Val & operator[](Enum idx)
    {
        typedef typename VectorByEnum::size_type idx_t;
        return std::vector<Val>::operator[](static_cast<idx_t>(idx));
    }
};

enum class A {
    One,
    Two
};

class B
{
public:
    int bar() { return 0; }
};

int main(void)
{
    VectorByEnum<A, B> v(2);
    return v[A::Two].bar();
}