【问题标题】:How can I specify a return type for operator[]?如何为 operator[] 指定返回类型?
【发布时间】:2014-11-29 04:48:05
【问题描述】:

是否可以为重载的operator[] 显式指定返回类型?

例如,我有一个带有重载运算符[] 的对象实例,如果我使用instance["num"],我希望它返回一个intinstance["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&lt;int&gt;["int_value"],但这是语法错误,无法编译。

【问题讨论】:

  • 没有。为什么不使用成员函数:int amountOfEntries()float percentage()?这就是 c++ 的做法。
  • @quantdev:因为 get 前缀在 C++ 中冗长且适得其反?开始,正如我常说的那样。
  • @Cheersandhth.-Alf 这是你的意见(我已重命名),无论如何命名你想要的函数。
  • @quantdev 因为我正在尝试创建一个用户可修改的设置类。 Aka 我有一个类,它有一定数量的设置(例如maxAmountOfX:intmodeOfSomething:char* 等),然后由我的程序逻辑使用,但我也希望它们能够被用户修改instance[user_input[0]] = parse_user_input(user_input[1]); 而不是像 if(user_input[0] == "maxAmountOfX"){ this-&gt;maxAmountOfX = user_input[1]; } ... 那样巨大的
  • 您可以尝试一个通用命名的方法,例如setting 并将其称为int value = instance.setting&lt;int&gt;("int_value");。不是您想要但可以工作的运算符语法。

标签: c++ templates visual-c++ operator-overloading


【解决方案1】:

不,使用operator[] 和运营商保持它那样没有很好的方法。问题主要在于,如果您采用模板方式,对于返回类型,您必须显式调用 operator[]&lt;Type&gt;(...) 及其变体。

另一方面,您可以返回一个通用的 boost::variantboost::any,然后由用户将其转换为正确的类型。

【讨论】:

    【解决方案2】:

    操作员无法轻松做到这一点。语法看起来像;

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

    替代方案可能包括返回 any 之类的内容;作为 boost 或即将推出的库扩展的一部分。

    你可以尝试一个通用命名的方法,例如setting 并称之为;

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

    不完全是您想要的运算符语法,但可以工作。在模板化函数上指定返回值比使用运算符更容易。

    【讨论】:

      【解决方案3】:

      这里有一个可能适合您的解决方案:

      #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;
      }
      

      我将它从返回引用更改为返回实例。并且对函数的调用不是很好,但这是我所知道的将函数调用编译为模板化操作符 [] 的唯一方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2017-01-18
        • 2020-09-10
        相关资源
        最近更新 更多