考虑这个类片段:
class A
{
public:
template <class T>
operator const T &() const;
};
在什么情况下这样的模板转换操作符适合?
答案 0 :(得分:2)
我没有看到它转换为参考(因为你会 通常想要返回一个临时的),但它通常是一部分 在返回类型上重载的技巧。你是主要的课程 有许多不同的吸气剂(或其他功能 返回不同的类型),通用的getter将返回 具有此类转换运算符的代理:
class MyClass
{
public:
template <typename T>
T typedGet() const { /*...*/ }
class Proxy
{
Main const* myOwner;
public:
Proxy( Main const& owner ) : myOwner( owner ) {}
template <typename T>
operator T()() const { return myOwner->typedGet<T>(); }
};
Proxy get() const { return Proxy( *this ); }
};
有了这个和MyClass
的实例,你可以写:
int x = myObj.get();
std::string y = myObj.get();
这通常用于配置文件条目,
其中typedGet
将使用std::istringstream
来转换
配置文件中的字符串为所需的任何类型
(当然,还会有一个专业化
std :: string,因为你不想要或不需要
std::istringstream
。)
使用C ++ 11,另一种可能的解决方案是:
auto x = myObj.get<int>();
auto y = myObj.get<std::string>();
我并不完全相信 - 这看起来有点像滥用
auto
,但我可以看到它的论点。当然
简化MyClass
的实施,因为您可以放弃
代理人。