c++ - 委托(delegate)给另一个对象的运算符(operator)->

标签 c++ templates c++11

在别名模板中编写,它将推断出某种类型 Toperator-> 的返回类型,到目前为止我有这个

template <typename T>
using arrow = decltype(std::declval<T&>().operator->());

适用于所有类类型,但不适用于指针。尝试实际调用 ->

时存在类似问题
template <typename T>
struct D {
    T t;
    arrow<T> f() { 
        // not valid to call .operator->() on pointers
        return t.operator->();
    }
};

我怎样才能让这个函数获得声明的正确返回类型,并正确地委托(delegate)类类型和指针?

最佳答案

对于一个指针,它的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);
}

然后委托(delegate)成员函数变为

template <typename T>
struct D {
    T t;
    arrow<T> f() { return apply_arrow(t); }    
};

关于c++ - 委托(delegate)给另一个对象的运算符(operator)->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549775/

相关文章:

c++ - 如何为模板嵌套类类型的函数声明参数?

c++ - std::regex 在 VC2015U3 上比 boost::regex 慢得多

c++ - 最适合正确测量缓存访问时间的计时器

c++ - 在 C++ 中对排列进行排序的最便宜的方法是什么?

c++ - 类型界面略有不同时模板的正确使用

c++ - 别名模板的包扩展

c++ - 返回一堆值的接口(interface)

c++ - 无用的反斜杠会产生定义明确的字符串常量吗?

c++ - 单元测试 C++ 静态库

html - 在自己的网站上实现 Bootstrap 导航栏