我正在尝试创建一个识别函数的类模板,我可以在其中识别函数何时专门化 R (*) ()
的类模型, 但在 std::function
你可以申报 return_type ()
, 和 std::is_same< int(), int (*) () >.::value
为零。
这是什么 int ()
statement mean 和int ()
有什么区别和 <br/>int (*) ()
?
int ()
是函数声明或函数类型并且int (*)()
是指向函数的指针。但是 waht 是 int (std::string::<em>)()</em>
的类型函数?类似于 int std::string::
()
,或喜欢 std::function
int(const std::string&)
?如何让这个程序输出 1? <p></p>
<pre><code>#include <iostream>
template<typename A,typename B>
struct IsSame{
enum{
value = 0};
};
template<typename A>
struct IsSame<A,A>{
enum{
value = 1
};
};
typedef int (SumType)(int,int)const;
class X{
public:
SumType sum;
};
int X::sum(int a,int b)const{
return a+b;
}
int main()
{
std::cout << IsSame< int (const std::string&,int,int)const,
decltype( &X::sum)>::value;
}
</code></pre>
最佳答案
一个函数有一个像 void()
这样的类型,如果你获取它的地址,你会得到一个指向该函数的指针 void(*)()
。它们不是同一类型,尽管函数可以衰减为指向函数的指针,其方式类似于数组衰减为指向第一个成员的指针。
这意味着您可以声明一个函数:
void f();
并将其分配给指向函数(具有相同签名)的指针:
void (*p_to_f)() = f;
并且该函数衰减为指向函数的指针。
这就是为什么我认为很难理解 void()
和 void(*)()
之间的区别,但它们是不同的类型,并且这种区别可以是在模板中很重要(这种衰减不一定会发生)。
不发生衰减的一个重要示例是匹配模板特化时。例如考虑 std::function
的作用:
template <class>
class function;
template <class R, class ... Args>
class function<R(Args...)> { /* ... stuff ... */ };
函数类型的特化不同于函数指针类型的特化。
function<void(int,int)> f;//matches specialisation
function<void(*)(int,int)> g;//does not match specialisation
回应 OP 的评论(现已删除):
为了也匹配指向函数的指针,您可以执行以下操作:
template <class R, class ... Args>
function<R(*)(Args...)> : function<R(Args...>{};
这实质上意味着您将函数和指向函数的指针视为相同。如果要匹配尽可能多的函数,还必须考虑成员函数、const 成员函数和 noexcept
函数(自 C++17 起)。如果想彻底,还有&
、&&
、const &
、const&&
、 volatile
等...但我不会担心这些,除非它们真的出现了。
关于c++ - int() 和 int(*)() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225401/