在别名模板上写一下,它会推断某种类型T
的{{1}}的返回类型,到目前为止,我有这个
operator->
适用于所有类类型,但不适用于指针。尝试实际调用template <typename T>
using arrow = decltype(std::declval<T&>().operator->());
->
如何让这个函数获得声明的正确返回类型,并为类类型和指针正确委托?
答案 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);
}