2014-11-29 3 views
3

Можно ли явно указать тип возврата для перегруженного operator[]?Как указать тип возврата для оператора []?

К примеру, у меня есть экземпляр объекта с перегруженным оператором [], и если я использую instance["num"], я хотел бы, чтобы вернуть int и instance["flt"]float (там уже типа логики обработки), как это:

int some_value = instance["amount_of_entries"]; 
float other_value = instance["percentage"]; 

Я попытался это:

class someClass { 
    template<class T> T& operator[](char* index){ ... } 
}; 

int val = instance["int_value"]; 

Но я получаю сообщение об ошибке:

error C2783: 'T &CSettings::operator [](char*)' : could not deduce template argument for 'T' 

Я думал об использовании instance<int>["int_value"], но это синтаксическая ошибка и не компилируется.

+0

Нет. Почему бы не использовать функции-члены: 'int amountOfEntries()' и 'float percent()'? Это был бы C++ способ сделать это. – quantdev

+1

@quantdev: потому что 'get'-префиксы являются подробными и контрпродуктивными в C++? getin, как я говорю. –

+0

@ Cheersandhth.-Alf Это ваше мнение (я переименовал), так или иначе назовите функции, как вы пожелаете. – quantdev

ответ

1

Это не способ сделать это легко с операторами. Синтаксис будет выглядеть примерно так:

instance.operator[]<int>("int_value"); 

Альтернативы могут включать возвращение чего-то вроде any; как часть повышения или предстоящих расширений библиотеки.

Вы можете попробовать использовать общий метод, например. setting и назовите его как;

int value = instance.setting<int>("int_value"); 

Не совсем синтаксис оператора, который вы хотели, но мог бы работать. Легче указать возврат на шаблонную функцию, чем с помощью оператора.

2

Нет, нет хорошего способа сделать это с operator[] и операторами, поддерживающими его , что приятно. Проблема в основном заключается в том, что если вы идете по шаблону, для типа возврата вам нужно будет явно позвонить operator[]<Type>(...) и варианты этого.

С другой стороны, вы можете вернуть общий boost::variant или boost::any, который затем будет литься пользователем надлежащим образом.

1

Вот решение, которое может работать для вас:

#include <iostream> 

class someClass { 
    public: 
    template<class T> T operator[](char* index){ 
     return T(); 
    } 
}; 

int main() 
{ 
    someClass foo; 
    std::cout << foo.operator[]<int>("some int"); 
    std::cout << foo.operator[]<double>("some double"); 
    int bar = 42; 
    std::cin >> bar; 
    return 0; 
} 

Я изменил его от возвращения ссылки возвращения экземпляра. И вызов функции не так хорош, но это единственный способ, с помощью которого я могу скомпилировать вызов функции для шаблонного оператора [].

Смежные вопросы