我试图理解函数类型之间的区别<void()>
和函数指针类型<void (*)()>
stl::function
可以通过<void()>
指向函数,但我似乎需要使用 <void (*)()>
在我自己的模板类中:
void f1() {
std::cout << "hi!\n";
}
template<class T> struct X
{
T t;
};
int main()
{
std::function<void()> f = f1; // stl handles this, and f is callable
f(); // OK
// X<void()> x; // compilation error - a member of a class template cannot aquire a function type
X<void (*)()> x2; // OK
x2.t = f1; // OK
x2.t(); // OK
return 0;
}
是诸如 <void()>
之类的函数类型C++ 11 的新增功能,与 std::function
一起引入?
我已经看到了一些与此相关的其他问题,但没有找到对我来说清楚的解释,并且在网络上搜索 C++ 函数类型并没有产生令人满意的结果。
我将非常感谢任何清晰的解释或引用。
最佳答案
函数类型对于 C++11 来说并不是什么新鲜事:甚至在 C 中也存在。但是,您不能拥有函数类型的对象,即,
template <typename T>
struct X {
T t;
};
X<void()> does_not_work;
X<void(*)()> works;
但是,您可以将函数类型转换为指针类型:
template <typename T>
struct X {
T* t;
};
以不同的方式使用函数而不是调用函数时,函数会分解为函数指针。将函数退化为指针相当于获取函数的地址。
当然,什么std::function<...>
无论如何,确实是完全不同的:它实际上定义了一个函数调用运算符。为此,它需要一个通用模板并专门用于函数类型:
template <typename> class function;
template <typename R, typename... A>
class function<R(A...)> {
public:
R operator()(A...);
// ...
};
关于c++ - STL函数和函数类型 vs 函数指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59552023/