【发布时间】:2020-05-20 21:55:33
【问题描述】:
我有一个类,它既具有隐式转换 operator() 到内在类型的能力,又具有通过用于设置存储的字符串索引 operator[] 进行访问的能力。它在 gcc 6.3 和 MSVC 的单元测试中编译和工作得非常好,但是该类在智能感知和 clang 上会引起一些不明确的警告,这是不可接受的。
超级瘦身版: https://onlinegdb.com/rJ-q7svG8
#include <memory>
#include <unordered_map>
#include <string>
struct Setting
{
int data; // this in reality is a Variant of intrinsic types + std::string
std::unordered_map<std::string, std::shared_ptr<Setting>> children;
template<typename T>
operator T()
{
return data;
}
template<typename T>
Setting & operator=(T val)
{
data = val;
return *this;
}
Setting & operator[](const std::string key)
{
if(children.count(key))
return *(children[key]);
else
{
children[key] = std::shared_ptr<Setting>(new Setting());
return *(children[key]);
}
}
};
用法:
Setting data;
data["TestNode"] = 4;
data["TestNode"]["SubValue"] = 55;
int x = data["TestNode"];
int y = data["TestNode"]["SubValue"];
std::cout << x <<std::endl;
std::cout << y;
output:
4
55
错误信息如下:
多个运算符“[]”匹配这些操作数:
内置运算符“integer[pointer-to-object]”函数
"设置::操作符[](std::string key)"
操作数类型有:设置 [ const char [15] ]
我理解为什么会出现错误/警告,因为它能够使用数组本身来反转数组上的索引器(这本身就是一种非常奇怪的语法,但对于指针算术具有逻辑意义)。
char* a = "asdf";
char b = a[5];
char c = 5[a];
b == c
我不确定如何避免它呈现的错误消息,同时保持我想要完成的任务。 (隐式赋值和字符串索引)
这可能吗?
注意:我不能使用 11 以上的 C++ 功能。
【问题讨论】:
标签: c++ c++11 operator-overloading