c++函数指针作为模板

C++ function pointer as template

本文关键字:函数 指针 c++      更新时间:2023-10-16

我刚刚开始学习c++,如果这是一个新手的问题,我很抱歉。我在网上找遍了,没有找到任何关于这个的东西。事实上,我甚至不确定如何制定我的搜索…

我在什么地方看到过这段代码:

template <class T>
struct SomeStruct
{
    SomeStruct() {}
};

然后是:

int main()
{
    SomeStruct<void (Foo::*)(int test)> mStruct;
}

上面的代码可以很好地编译。

因此,如果我理解正确的话,"void (Foo::*)(int test)"是一个函数指针,指向Foo中的某个函数,以int作为参数并返回void。

这怎么可能是"class T"形参的合法实参呢?

void (Foo::*)(int test)是指向成员函数的指针类型。这种类型的变量可用于指向类Foo的成员函数(该函数返回void并接受单个int参数)。

class T在这里是用词不当——无论模板是用template<class T>还是template<typename T>声明的,任意类型都可以用作模板形参(该类型不必声明为class)。

因此,我不使用第一种形式,只使用后者。

在模板声明的模板形参列表上下文中,typenameclass可以互换使用,除了必须在模板模板形参中使用class(如c++ 1z之前的template<template<typename, typename> class>)。

是一个函数指针类型。完全合法。

实参不必是一个实际的类;在这里使用class会产生误导,并等同于更清晰的typename

如果你真的想被吓到,查找非类型模板参数,因为实际上你可以传递一个实际的函数指针(稍微修改一下)。:)