我可能会谦虚地报告,我建议的(在问题中)解决方案确实有效。
特别感谢圣黑猫先生,他发现了一个缺陷,所以我添加了 'dbj::remove_all_ptr_t`。现在解决方案现在也适用于双、三等指针。
魔杖盒来了
namespace dbj
{
template <typename T> struct remove_all_ptr { typedef T type; };
template <typename T> struct remove_all_ptr<T*> {
using type = typename remove_all_ptr<std::remove_cv_t<T>>::type;
};
template <typename T>
using remove_all_ptr_t = typename remove_all_ptr<T>::type ;
template< class T >
struct remove_cvref {
typedef std::remove_cv_t<std::remove_reference_t<T>> type;
};
template< class T >
using remove_cvref_t = typename remove_cvref<T>::type;
template <class T>
using to_base_t =
remove_all_ptr_t< std::remove_all_extents_t< remove_cvref_t < T > > >;
} // dbj
Mr Holy Black Cat 解决方案也有效。虽然有些人可能会觉得它有点复杂(我个人认为不是)。
我的解决方案在命名空间中dbj
,而他在命名空间中hbc
。这是我的快速测试。
// testing
static_assert(std::is_same_v<std::string, hbc::base_t<std::string * (&)[42]>>);
static_assert(std::is_same_v<std::string ,dbj::to_base_t<std::string * (&)[42]>>);
static_assert(std::is_same_v<void (), hbc::base_t<void ()>>);
static_assert(std::is_same_v<void (), dbj::to_base_t<void ()>>);
//
struct X { char data{}; char method () const { return {};} };
static_assert(std::is_same_v<X, hbc::base_t<X (&) []>>);
static_assert(std::is_same_v<X, dbj::to_base_t<X (&) []>>);
//
using method_t = char (X::*)() ;
static_assert(std::is_same_v<method_t, hbc::base_t< method_t (&) []>>);
static_assert(std::is_same_v<method_t, dbj::to_base_t< method_t (&) []>>);
两种解决方案都通过了上述测试。魔杖盒来了。谢谢大家的宝贵讨论。