设置。
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)]; }
这样可能吗?
答案 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();
}