是否可以显式指定重载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'
,但这是一个语法错误,无法编译。
答案 0 :(得分:2)
不,使用operator[]
并且运算符保持 很好的方法没有很好的方法。问题主要在于,如果您使用模板方式,对于返回类型,您必须明确调用operator[]<Type>(...)
及其变体。
另一方面,您可以返回通用boost::variant
或boost::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");
不是您想要的运算符语法,但可以工作。在模板化函数上指定返回比使用运算符更容易。