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!");