С ++ оператор скобки для литейных типов - PullRequest
0 голосов
/ 27 сентября 2018

Настройка.

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 голосов
/ 27 сентября 2018

Вы не можете перегрузить 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();
}
...