什么是无约束转换运算符模板,它有什么用?

时间:2013-09-10 16:21:09

标签: c++ templates type-conversion

考虑这个类片段:

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

在什么情况下这样的模板转换操作符适合?

1 个答案:

答案 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的实施,因为您可以放弃 代理人。