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

时间:2014-11-29 04:48:05

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

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

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

3 个答案:

答案 0 :(得分:2)

不,使用operator[]并且运算符保持 很好的方法没有很好的方法。问题主要在于,如果您使用模板方式,对于返回类型,您必须明确调用operator[]<Type>(...)及其变体。

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

答案 1 :(得分: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;
}

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

答案 2 :(得分:1)

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

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

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

你可以尝试一般命名的方法,例如setting并将其命名为;

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

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