如何为 operator[] 指定返回类型

How can I specify a return type for operator[]?

本文关键字:返回类型 operator      更新时间:2023-10-16

是否可以显式指定重载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"],但这是一个语法错误,无法编译。

不,没有很好的方法可以让operator[]和运算符保持那么好。问题主要在于,如果你采用模板的方式,对于返回类型,你必须显式调用operator[]<Type>(...)和它的变体。

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

使用

运算符无法轻松执行此操作。语法看起来像这样;

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

替代方案可能包括返回类似 any ; 作为 boost 或即将到来的库扩展的一部分。

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

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

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

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

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

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