C/C++ 11 语言标准库提供的 std::remove_pointer<T>,是没有办法删除 “共享引用指针” 获取其T泛型成员类型的,但人们可以自行实现相应的功能。
C/C++ 11 语言上面,可以通过 “decltype(expression)” 关键字来让编译器推导并定义类型,但对于 C/C++ 工程师而言,好的办法是使用 “泛型模板” 来推导并定义其成员类型。
参考实现:
泛型:frp/stdafx.h at main · liulilittle/frp (github.com)
应用: frp/SslSocket.hpp at main · liulilittle/frp (github.com)
模板应用:
namespace frp {
namespace transmission {
namespace templates {
template<class T>
class SslSocket : public IDisposable {
inline bool HandshakeAsync(HandshakeType type, const BOOST_ASIO_MOVE_ARG(HandshakeAsyncCallback) callback) noexcept {
typedef typename stl::remove_pointer<T>::type SslSocket; /* decltype(*ssl_socket_); */
}
};
}
}
}
模板实现:
namespace stl {
template<class T>
struct remove_pointer {
typedef T type;
};
template<class T>
struct remove_pointer<T*> {
typedef T type;
};
template<class T>
struct remove_pointer<T* const> {
typedef T type;
};
template<class T>
struct remove_pointer<T* volatile> {
typedef T type;
};
template<class T>
struct remove_pointer<T* const volatile> {
typedef T type;
};
template<class T>
struct remove_pointer<std::shared_ptr<T> > {
typedef T type;
};
template<class T>
struct remove_pointer<std::shared_ptr<T>&> {
typedef T type;
};
template<class T>
struct remove_pointer<std::shared_ptr<T> const&> {
typedef T type;
};
}