Я думаю, что когда-либо вы это сделаете, это будет связано с множеством условных утверждений. Но для отдельных операций, например, в ваших примерах, вы можете ограничить это до 4 операторов с чем-то вроде
String math = "1+4";
if (math.split("+").length == 2) {
//do calculation
} else if (math.split("-").length == 2) {
//do calculation
} ...
. Это становится намного сложнее, если вы хотите иметь дело с несколькими операциями типа «4 + 5 * 6 ".
Если вы пытаетесь построить калькулятор, я бы перегружал каждую секцию вычисления отдельно (каждый номер или оператор), а не как одну строку.
(*this)[bar];
хорошо работает для меня.
Используйте
(*this)[bar]
для вызова operator[]
из объекта экземпляра.
this[bar]
обработки this
указатель как массив и индексы bar
-th элемент того массива (возвращающий ссылку вероятного недопустимого объекта).
Я использую в () функция и имею оператор [], звонят в () функция негласно, таким образом, оператор [] является просто синтаксическим сахаром. Это то, как станд.:: вектор делает это, таким образом, это походит на разумное (с приоритетом) способ сделать это.
Теперь для полного синтаксического сахарного взлома (не может сказать, я полностью рекомендую это, но мог бы ударить Ваше воображение):
class Widget
{
Widget& self;
public:
Widget() :self(*this)
{}
void operator[](int)
{
printf("hello");
}
void test()
{
//scripting like sugar
//you pay the price of an extra reference per class though
self[1];
}
};
int main(int argc, char* argv[])
{
Widget w;
w[1];
w.test();
return 0;
}
Также, если Вы хотите сделать, это бесплатно, не оплачивая стоимость ссылки, И является подписчиком некоторой злой секты, выделенной тому, чтобы заставлять программистов пострадать, Вы могли сделать:
#define self (*this)
На самом деле я думаю, что это - то, как большинство дескрипторов реализовано в API NS Apple...
Альтернатива (*this)[bar]
должна использовать именованную функцию членства, которая делает работу operator[]
. Перегруженные операторы делают вещи легче на Ваших пользователях. Что еще более важно, они - часть интерфейса Вашего класса . Спросите себя, если действительно имеет смысл реализовывать Ваш класс с точки зрения своего собственного открытого интерфейса. В противном случае я предлагаю писать отдельное (защищенный или частный) функция членства, чтобы сделать работу и затем иметь operator[]
и любой другой вызов функции это.
Вы могли использовать (*this) [панель] , но это не могло бы быть большой частью улучшения...