如何获取return类型的成员函数指针
how to get a return type of a member function pointer
有没有办法确定成员函数指针的 return 类型?
代码示例:
///// my library
void my_func(auto mptr) { // have to use `auto`
// some logic based on a return type of mptr: int, string, A, etc.
}
///// client code
struct A {
int foo();
std::string bar(int);
};
class B{
public:
A func(int, double);
};
// ... and many other classes
my_func(&A::foo);
my_func(&A::bar);
my_func(&B::func);
// ... many other calls of my_func()
我需要“填写”my_func()
。
编辑:
我不能使用 std::result_of
/std::invoke_result
,因为我不知道 mptr
的完整参数列表。一个方法应该用哪个参数调用并不重要,因为我没有调用它。我想避免创建 mptr
的基数 class 的对象,即使我能够确定它(使用 declval
没问题)。
您可以使用部分模板特化来确定 mptr
的 return 类型:
template <typename T>
struct ReturnType;
template <typename Object, typename Return, typename... Args>
struct ReturnType<Return (Object::*)(Args...)>
{
using Type = Return;
};
void my_func(auto mptr) {
typename ReturnType<decltype(mptr)>::Type obj;
}
您可以编写一个函数来推导成员函数指针的类型,并且 return 是推导的 return 类型。注意只需要声明,不需要定义
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...)) -> Ret;
void my_func(auto mptr)
{
using type = decltype(ret_type(mptr));
}
在我看来,这也比专业化解决方案更容易阅读。
这是一个demo
您还可以通过添加重载来解释 cv-限定符。例如
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...) const) -> Ret;
这是一个demo
有没有办法确定成员函数指针的 return 类型?
代码示例:
///// my library
void my_func(auto mptr) { // have to use `auto`
// some logic based on a return type of mptr: int, string, A, etc.
}
///// client code
struct A {
int foo();
std::string bar(int);
};
class B{
public:
A func(int, double);
};
// ... and many other classes
my_func(&A::foo);
my_func(&A::bar);
my_func(&B::func);
// ... many other calls of my_func()
我需要“填写”my_func()
。
编辑:
我不能使用 std::result_of
/std::invoke_result
,因为我不知道 mptr
的完整参数列表。一个方法应该用哪个参数调用并不重要,因为我没有调用它。我想避免创建 mptr
的基数 class 的对象,即使我能够确定它(使用 declval
没问题)。
您可以使用部分模板特化来确定 mptr
的 return 类型:
template <typename T>
struct ReturnType;
template <typename Object, typename Return, typename... Args>
struct ReturnType<Return (Object::*)(Args...)>
{
using Type = Return;
};
void my_func(auto mptr) {
typename ReturnType<decltype(mptr)>::Type obj;
}
您可以编写一个函数来推导成员函数指针的类型,并且 return 是推导的 return 类型。注意只需要声明,不需要定义
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...)) -> Ret;
void my_func(auto mptr)
{
using type = decltype(ret_type(mptr));
}
在我看来,这也比专业化解决方案更容易阅读。
这是一个demo
您还可以通过添加重载来解释 cv-限定符。例如
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...) const) -> Ret;
这是一个demo