考虑这个类片段:
class A
{
public:
template <class T>
operator const T &() const;
};
这种模板化的转换运算符在什么情况下适用?
考虑这个类片段:
class A
{
public:
template <class T>
operator const T &() const;
};
这种模板化的转换运算符在什么情况下适用?
我没有看到它转换为引用(因为您通常希望返回一个临时值),但它通常是重载返回类型的技巧的一部分。您的主类将有许多不同的 getter(或其他返回不同类型的函数),通用 getter 将返回具有这种类型转换运算符的 Proxy:
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
,因为您可以放弃代理。