C++ 模板化运算符[]。。。可能的有用吗?

C++ 模板化运算符[]。。。可能的有用吗?,c++,templates,C++,Templates,你可以: template <class T> const T &operator[] (unsigned int x) 这个C++离我们有多近?这值得你付出痛苦吗?你不能进入: int i = obj["IntVal"]; 无法从上下文推断T的实际类型,因为返回类型不是函数签名的一部分 此外,出于内存和性能考虑,将整数值存储为字符串不被视为最佳做法;-) 你看过吗?这就是您要寻找的吗?好吧,您在示例代码中编写的内容与问题不匹配。现在,您只有返回类型模板 但如果你想做以

你可以:

template <class T>
const T &operator[] (unsigned int x)
<>这个C++离我们有多近?这值得你付出痛苦吗?

你不能进入:

int i = obj["IntVal"]; 
无法从上下文推断T的实际类型,因为返回类型不是函数签名的一部分


此外,出于内存和性能考虑,将整数值存储为字符串不被视为最佳做法;-)

你看过吗?这就是您要寻找的吗?

好吧,您在示例代码中编写的内容与问题不匹配。现在,您只有返回类型模板

但如果你想做以下事情:

template <class T>
const T &operator[const T& x]
模板
常量T和运算符[常量T和x]
这是正确的,尽管可能不是非常有用。

不值得

模板化返回类型意味着您必须在调用它时显式指定模板参数。类似这样的东西,可能我的语法错了:

int i = obj.operator[]<int>("IntVal");

正如Amit所说,您可以定义
操作符[]
来返回一个类型,该类型可以转换为
int
或其他类型。然后,您的示例代码可以在不使用显式词法转换的情况下进行编译。

映射已经提供了一个重载的
操作符[]
,它可以完成您想要的大部分工作。您似乎希望缺少的是从碰巧包含数字的字符串隐式转换为整数。C++的一个基本特性是静态类型,它表示不应该允许,所以它不是。如果您愿意,它会很乐意进行转换,但您必须要求:

int i = lexical_cast<int>(obj["IntVal"]);
inti=lexical_cast(obj[“IntVal”]);
或者,您可以创建一个类似字符串的类,该类支持隐式转换为
int
。就我个人而言,我建议不要这样做。我并不像许多人那样强烈地反对隐式转换,但这仍然是一个相当糟糕的想法,至少对于大多数一般用途来说是如此。

你也可以这样做

class Class {
  struct Proxy {
    template<typename T> T as() { ... }
    template<typename T> operator T() { return as<T>(); }
  private:
    Proxy(...) { ... }
    Proxy(Proxy const&); // noncopyable
    Proxy &operator=(Proxy const&);
    friend class Class;
  };

public:
  Proxy operator[](std::string const& s) { ... }
};

Class a;
int i = a["foo"];
int i = a["foo"].as<int>();
类{
结构代理{
模板T作为(){…}
模板运算符T(){返回为();}
私人:
代理(…){…}
Proxy(Proxy const&);//不可复制
代理和运算符=(代理常量&);
朋友班;
};
公众:
代理运算符[](std::string const&s){…}
};
甲级;
int i=a[“foo”];
int i=a[“foo”].as();

T
将被推断为要初始化的对象是什么。不允许复制代理。也就是说,我更喜欢显式的
as
函数,就像另外一个建议的函数一样

重载函数只能在返回类型上有所不同。因此,我认为这并不简单。值得一提的是,我曾经做过类似的事情,最终得到了类似
inti=obj[“IntVal”].as()的语法。或者可能
inti=obj.get(“IntVal”)
。您可以使用隐式转换来获得所需的语法,但这会带来其他方面的麻烦。另一个语法建议(我以前使用过,也在pqxx中使用过)是,不要返回值,将其作为参数传递,并允许编译器进行类型推断:
obj[key].to(var)
。这样就不需要在方法调用中使用显式类型了。@Seb这是一个很好的答案,我希望我的编辑有所改进。如果没有,请随意回滚。您做到了:-)作为一名新来者,我不知道您可以使用富文本格式,对不起,无需道歉-要格式化代码,请选择它,然后使用文本输入区域上方的1010按钮。不要尝试使用HTML标记。“将整数值存储为字符串不被视为最佳实践”。。。当然可以,但在很多情况下仍然会发生这种情况,例如,任何时候使用XML或文本模式文件。使用
操作符[]
的赋值似乎不可能使用这种方法。有什么办法可以让这一切顺利进行吗?
int i = boost:lexical_cast<int>(obj["IntVal"]);
int i = lexical_cast<int>(obj["IntVal"]);
class Class {
  struct Proxy {
    template<typename T> T as() { ... }
    template<typename T> operator T() { return as<T>(); }
  private:
    Proxy(...) { ... }
    Proxy(Proxy const&); // noncopyable
    Proxy &operator=(Proxy const&);
    friend class Class;
  };

public:
  Proxy operator[](std::string const& s) { ... }
};

Class a;
int i = a["foo"];
int i = a["foo"].as<int>();