Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取成员函数指针的返回类型_C++_Typetraits_Member Function Pointers_Decltype - Fatal编程技术网

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
,只需做一些小改动。谢谢@马克西米基洛夫:没问题。请注意,您最多只能选择一个答案来接受(我注意到您已尝试接受此答案),因此请选择您最喜欢的答案。如果您愿意,您可以随时向上投票多个答案。它也很有效,谢谢@马克西米基洛夫:没问题。请注意,您最多只能选择一个答案来接受(我注意到您已尝试接受此答案),因此请选择您最喜欢的答案。如果你想的话,你总是可以投票给多个答案。