2015-09-11 261 views
4

我刚刚开始使用C++,所以很抱歉,如果这是一个新手问题。我在网上搜索了所有内容,但没有发现任何关于此的内容。其实我当时甚至不知道如何制定我的搜索...C++函数指针作为模板

我看到这个代码的地方:

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

后来,这样的:

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

以上编译就好了。所以如果我正确地理解它,“void(Foo :: *)(int test)”是一个函数指针,它指向Foo中的某个函数,并将int作为参数并返回void。

这怎么可能是“T类”参数的合法参数?

任何帮助,将不胜感激。

回答

8

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

class T是用词不当那里 - 任意类型可以用来作为模板参数(类型不必声明为class),不管如果模板被声明用template<class T>template<typename T>

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

在模板声明,typenameclass的模板参数列表的情况下可以互换使用,除了你必须C++ 1Z。之前使用模板模板参数class(如template<template<typename, typename> class>

+1

那么,有时你别无选择,只能使用第一种形式,但要点。 – AndyG

5

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

的说法并不一定是一个实际的类;。使用class有误导性的,并且是等同于更清晰typename

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

+0

在我的例子中,类T(或typename T)是一个Type模板参数吧?根据此(http://en.cppreference.com/w/cpp/language/template_parameters),函数指针应该被分类为非类型模板参数。然后它声明:“表单类Foo的模板参数不是类型为Foo的非命名非类型模板参数,即使其他类Foo是详细类型说明符和类Foo x;也将x声明为Foo类型。我现在很吓坏了... –

+0

@WildonZimmer该引用有点令人困惑,但据我所知,可能的事物'类型'的列表可以在“非类型”标题下,只是为了指示*可以被认为是“非类型”参数的限制 - *不*表示这些项目对于“类型模板参数作为模板*参数*无效”。“ –

+0

@WildonZimmer换句话说,事情是否被认为是‘型’或‘非类型’参数由模板*声明*的形式,不取决于什么实际使用*实例化*的模板。 –