c++ - STL函数和函数类型 vs 函数指针类型

标签 c++ templates function-pointers

我试图理解函数类型之间的区别<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/

相关文章:

c++ - 模板模板 C++ 函数

C++ 未定义对使用模板的类的引用

c++ - 函数可以接受静态函数指针作为参数吗?

c++ - 将在类中声明的函数作为参数传递会导致编译错误

css - 如何在 Angular 5 元素中为管理员和用户使用单独的模板?

c - 理解调用函数指针

C++:高层类层次结构

c++ - 为什么 C 允许我调用未声明的函数?

c++ - 函数返回空指针而不是地址

c++ - 需要帮助创建一个使用我编写的头文件的简单控制台程序