Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ Can C++;11 decltype是否用于从现有函数创建函数指针的typedef?_C++_C++11_Decltype - Fatal编程技术网

C++ Can C++;11 decltype是否用于从现有函数创建函数指针的typedef?

C++ Can C++;11 decltype是否用于从现有函数创建函数指针的typedef?,c++,c++11,decltype,C++,C++11,Decltype,给定 我可以创建一个成员函数指针,如下所示: struct A { int foo(double a, std::string& b) const; }; 很简单,只是如果A::FOO的签名发生更改,就需要更新PFN\u FOO。由于C++11引入了decltype,它可以用来自动推断签名并创建typedef吗?当然可以: typedef decltype(&A::foo)PFN_foo 您还可以通过关键字定义类型别名(感谢Matthieu M.): 使用PFN\u FOO=

给定

我可以创建一个成员函数指针,如下所示:

struct A { 
    int foo(double a, std::string& b) const;
};
很简单,只是如果
A::FOO
的签名发生更改,就需要更新
PFN\u FOO
。由于C++11引入了
decltype
,它可以用来自动推断签名并创建typedef吗?

当然可以:

typedef decltype(&A::foo)PFN_foo

您还可以通过关键字定义类型别名(感谢Matthieu M.):


使用PFN\u FOO=decltype(&A::FOO)

一个问题:只有在变量明确的情况下,才可以推断变量的类型

函数的主要问题是重载意味着它们的名称本身不足以识别它们。因此,如果在
A
中引入了
foo
重载,那么使用
decltype
将失败

typedef int (A::*PFN_FOO)(double, std::string&) const;
不确定你会因此得到多少

另一方面,您可以实际使用别名并检查别名是否正确:

结构A{ void foo()常量; void foo(int)const; }; 使用PFN_FOO=void(A::*)(int)const; 静态断言(std::is_same::value, “哦,需要更新PFN_-FOO的签名!”;

注意:不确定这是最好的测试方法,基本上您只需要
静态\u cast
部分,我只是想在旁边隐藏一条错误消息。你可能需要像SFINAE这样的东西来获得更好的信息。

+1作为答案,但希望我能给-1,因为我比我快了30秒!:pOf课程;-)但这仅仅是理论上的吗?我无法将其编译()。抱歉,请快点,否则。。。如果没有rep:-),您也可以一直使用C++11:
使用PFN_FOO=decltype(&A::FOO)@NicolBolas OP没有提到重载,但是Matthieu M.在他的回答中已经提到了这一点。Mathieu:谢谢-是的,我也意识到了这一点,因为我试图摆脱复杂的typedef,这正是解决重载所需要的。不过我喜欢你的静态音乐!
struct A {
    void foo() const;
    void foo(int) const;
};

using PFN_FOO = decltype(A::foo);
source.cpp:6:36: error: decltype cannot resolve address of overloaded function
struct A {
    void foo() const;
    void foo(int) const;
};

using PFN_FOO = void (A::*)(int) const;

static_assert(std::is_same<PFN_FOO, decltype(static_cast<PFN_FOO>(&A::foo))>::value,
     "Ooops, need to update signature of PFN_FOO!");