Я хотел иметь черты типа, которые помогут мне получить тип класса
из указателя на функцию-член. Я посмотрел на этот ответ
и нашел свою половину пути к цели.
Это выглядит так:
#include <iostream>
// example class
struct MyClass {
void funct() { std::cout << "funct has been called....\n"; }
};
// traits
template<typename Class> struct get_class{};
template<typename ReType, typename Class, typename... Args>
struct get_class<ReType(Class::*)(Args...)>
{
using type = Class;
};
template<typename Type> using get_class_t = typename get_class<Type>::type;
int main()
{
get_class_t<decltype(&MyClass::funct)> myObj;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ---> this is a lot of typing
myObj.funct();
return 0;
}
Но, как показано в коде, мне нужно каждый раз писать get_class_t<decltype(&MyClass::funct)>
или в случае
auto ptr = &MyClass::funct;
get_class_t<decltype(ptr)> myObj;
// ^^^^^^^^^^^^^^
что много decltype()
инг. Я хотел бы написать вместо
class_t<ptr> obj;
or
class_t<&MyClass::funct> myObj;
что удобнее.
Я выполнил следующую функцию, которая будет возвращать результирующий объект класса
и, может быть, я мог бы сделать, хочу я хотел.
template<typename Type>
auto helper_function(Type ptr)->get_class_t<Type>
{
return get_class_t<Type>{};
}
template<typename Type>
using class_t = /* decltype(helper_function(Type ptr));*/
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // what could be here?
Я не знаю, как это сделать. Моя цель - расширить черты таким образом, чтобы я
может создать объект как
auto ptr = &MyClass::funct;
class_t<ptr> myObj;
// or
class_t<&MyClass::funct> myObj;
Есть ли другой способ сделать это? или я должен придерживаться decltype()
ING
Как я уже отметил, я хотел бы посмотреть, возможно ли это с C ++ 11?