委托给另一个对象的运营商 - >

时间:2015-05-30 18:22:42

标签: c++ templates c++11

在别名模板上写一下,它会推断某种类型T的{​​{1}}的返回类型,到目前为止,我有这个

operator->

适用于所有类类型,但不适用于指针。尝试实际调用template <typename T> using arrow = decltype(std::declval<T&>().operator->());

时存在类似的问题
->

如何让这个函数获得声明的正确返回类型,并为类类型和指针正确委托?

1 个答案:

答案 0 :(得分:5)

对于指针,其template <typename T> struct D { T t; arrow<T> f() { // not valid to call .operator->() on pointers return t.operator->(); } }; 自身类型的类型以及生成的对象具有相同的值。使用另一个间接层,辅助结构可以专门用于指针类型

operator->()

为了简化使用,可以轻松定义别名模板和函数

template <typename T>
struct ArrowHelper {
    using type = decltype(std::declval<T&>().operator->());
    type operator()(T& t) const {
        return t.operator->();
    }
};

template <typename T>
struct ArrowHelper<T*> {
    using type = T*;
    constexpr type operator()(T* t) const noexcept {
        return t;
    }
};
然后

委托成员函数

template <typename T>
using arrow = typename ArrowHelper<T>::type;

template <typename T>
arrow<T> apply_arrow(T& t) {
    return ArrowHelper<T>{}(t);
}