在别名模板中编写,它将推断出某种类型 T
的 operator->
的返回类型,到目前为止我有这个
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/