我正在尝试创建一个重载下标运算符的模板,以便同时使用int和string值,并且能够以以下方式赋值:MyClass[0]=1;
首先,我不使用模板,只针对整数进行测试:
class storage {
public:
int& operator[](int idx) { return int_store[idx]; }
int_store[10];
}
主代码:
int main() {
storage my_ints;
my_ints[0] = 100;
my_ints[1] = 200;
my_ints[2] = 300;
}
前面的代码可以工作,因此它将其设置为模板:
template <typename T>
T& operator[](int idx) { return int_store[idx]; }
类storage
编译,但我在main()变量赋值中发现错误,原因是error:lvalue需要作为赋值的左操作数
我无法确定错误的根源。
我不确定这是否真的是您想要的,但从本质上看,您想要的似乎是让您的类MyClass
这样操作:
MyClass m(77); int j; std::string s; j = m[0]; s = m[0];
我想您可以用一个模板来实现这一点,类似于
template<typename T> T& operator[](int i){ return my_cast_func<T>(this->buffer[i]); }
其中my_cast_func
指的是以前根据t
(手动)定义的一系列模板。
然而,你应该问自己的真正问题是,我到底想做什么? 使模板执行您想要的操作所需的代码将至少与非模板版本一样复杂。 使用模板的唯一原因是编写非常通用的代码,这些代码不知道它将处理哪种特定类型的数据--例如,数学代码,它与int
和double
无关,存储容器--但是,像这样混合string
和int
是非常罕见的。