1

考虑这个类片段:

class A
{
public:
    template <class T>
    operator const T &() const;   
};

这种模板化的转换运算符在什么情况下适用?

4

1 回答 1

2

我没有看到它转换为引用(因为您通常希望返回一个临时值),但它通常是重载返回类型的技巧的一部分。您的主类将有许多不同的 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,因为您可以放弃代理。

于 2013-09-10T16:32:51.867 回答