这是一个小例子,用来说明两种不同的函数类型的区别:
#include <iostream>
#include <functional>
#include <type_traits>
template <typename T>
using BinaryOperator = T(const T&, const T&);
int main() {
std::cout << std::boolalpha
<< std::is_same<
std::function<int(const int&, const int&)>,
BinaryOperator<int>
>::value
<< std::endl;
return 0;
}
这会打印false
,这使我感到困惑。这两种类型似乎是等效的。它们有什么不同?
答案 0 :(得分:2)
这两种类型似乎是等效的。它们有什么不同?
嗯...不:它们是不同的类型。
如果查看std::function
's page in cppreference.com,您会发现std::function
是具有部分专业化(仅定义了专业化)的类,声明如下:
template <class>
class function; // undefined
template <class R, class... Args>
class function<R(Args...)>;
因此,您的BynaryOperator<int>
不等同于std::function<int(const int&, const int&)>
,而是等同于其模板参数。
您可以看到它是true
std::is_same<std::function<int(const int&, const int&)>,
std::function<BinaryOperator<int>>
>::value // ^^^^^^^^^^^^^^...................^