C++ 如何获取成员函数指针的返回类型
有没有办法确定成员函数指针的返回类型 代码示例:C++ 如何获取成员函数指针的返回类型,c++,typetraits,member-function-pointers,decltype,C++,Typetraits,Member Function Pointers,Decltype,有没有办法确定成员函数指针的返回类型 代码示例: ///// 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:
///// 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\u of
/std::invoke\u result
,因为我不知道mptr
的完整参数列表。调用方法的参数并不重要,因为我不调用它。我希望避免创建mptr
基类的对象,即使我能够确定它(使用declval
也可以)。您可以使用部分模板专门化来确定mptr
的返回类型:
模板
结构返回类型;
模板
结构返回类型
{
使用类型=返回;
};
作废我的功能(自动mptr){
typename ReturnType::Type obj;
}
您可以使用部分模板专门化来确定
mptr的返回类型:
模板
结构返回类型;
模板
结构返回类型
{
使用类型=返回;
};
作废我的功能(自动mptr){
typename ReturnType::Type obj;
}
您可以编写一个函数来推断成员函数指针的类型,并返回推断的返回类型。注意,只需要一个声明,不需要定义
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));
}
模板
自动ret_类型(ret(C::*)(Args…)->ret;
作废我的功能(自动mptr)
{
使用类型=decltype(ret_类型(mptr));
}
在我看来,这也比专门化解决方案更容易阅读
这里有一个
还可以通过添加重载来说明cv限定符。e、 g
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...) const) -> Ret;
模板
自动ret_类型(ret(C::*)(Args…)const)->ret;
下面是一个您可以编写一个函数来推断成员函数指针的类型,并返回推断的返回类型。注意,只需要一个声明,不需要定义
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));
}
模板
自动ret_类型(ret(C::*)(Args…)->ret;
作废我的功能(自动mptr)
{
使用类型=decltype(ret_类型(mptr));
}
在我看来,这也比专门化解决方案更容易阅读
这里有一个
还可以通过添加重载来说明cv限定符。e、 g
template <typename C, typename Ret, typename... Args>
auto ret_type(Ret (C::*)(Args...) const) -> Ret;
模板
自动ret_类型(ret(C::*)(Args…)const)->ret;
这里有一个即使你可以得到退货类型,你打算如何使用它?您不能调用mptr()
,因为您不知道它需要什么参数。您的示例有不同的参数列表。为什么必须使用auto
?您的代码库中是否禁止使用模板?在这种情况下,你也不能在那里使用auto
。@RemyLebeau,我不想让我的例子变得复杂。假设我需要声明一个mptr
返回类型的变量。@RemyLebeau,我可以根据自己的意愿修改my_func()
签名。但是我不能改变它的叫法。它是由我无法更改的代码中的预处理器指令生成的。请描述“一些逻辑”。你打算怎么处理这个类型?即使你可以得到返回类型,你打算如何使用它?您不能调用mptr()
,因为您不知道它需要什么参数。您的示例有不同的参数列表。为什么必须使用auto
?您的代码库中是否禁止使用模板?在这种情况下,你也不能在那里使用auto
。@RemyLebeau,我不想让我的例子变得复杂。假设我需要声明一个mptr
返回类型的变量。@RemyLebeau,我可以根据自己的意愿修改my_func()
签名。但是我不能改变它的叫法。它是由我无法更改的代码中的预处理器指令生成的。请描述“一些逻辑”。您将如何处理该类型?您可以使用部分模板专门化来执行任何操作,tbh@miles-budnek谢谢,它很有效!不幸的是,如果成员函数具有cv限定符或ref限定符,或者是C型变量,或者标记为noexcept
,则这将不起作用。请参阅上令人讨厌的“可能的实现”。@aschepper谢天谢地,我必须处理的成员函数和对象或多或少都遵循“模板”,因此我可以使用ReturnType
,只需稍作更改。您可以使用部分模板专门化来执行任何操作,tbh@miles-budnek谢谢,它很有效!不幸的是,如果成员函数具有cv限定符或ref限定符,或者是C型变量,或者标记为noexcept
,则这将不起作用。请参阅上令人讨厌的“可能实现”。@aschepper谢天谢地,我必须处理的成员函数和对象或多或少都遵循一个“模板”,因此我可以使用ReturnType
,只需做一些小改动。谢谢@马克西米基洛夫:没问题。请注意,您最多只能选择一个答案来接受(我注意到您已尝试接受此答案),因此请选择您最喜欢的答案。如果您愿意,您可以随时向上投票多个答案。它也很有效,谢谢@马克西米基洛夫:没问题。请注意,您最多只能选择一个答案来接受(我注意到您已尝试接受此答案),因此请选择您最喜欢的答案。如果你想的话,你总是可以投票给多个答案。