如何为 operator[] 指定返回类型
How can I specify a return type for operator[]?
是否可以显式指定重载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::variant
或boost::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;
}
我将其从返回引用更改为返回实例。对函数的调用并不那么好,但这是我所知道的编译对模板化运算符的函数调用的唯一方法[]。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- 为什么返回类型 std::reverse_iterator::operator[] 未指定
- 如何为 operator[] 指定返回类型
- 如果我想使类不可复制,"operator="返回类型是否重要?