int main(int argc, const char* argv[])
{
BlockTest<^(void) { NSLog(@"Hi, there!"); }>();
}
编译时会在第11行出现error: no matching function for call to \'BlockTest()\'。C++标准中明确指出,模板参数必须为常量表达式,如果是函数的话必须是带有外部连接(即external-linkage)的函数指针。而Blocks表达式首先 就不是一个常量表达式,然后它也没有外部连接。我们下面看第二个例子:
#import <Foundation/Foundation.h>
int main(int argc, const char* argv[])
{
BlockTest(^(int a) { NSLog(@"The value is: %dn", a); });
}
编译后出现 error: no matching function for call to \'BlockTest(void (^)(int))\'。即使显式地将<int>模板实参加上也没用。也就是说Blocks的参数类型包括返回类型不能是一个泛型。我们再看第三个例子:
#import <Foundation/Foundation.h>
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
void BlockTest(T pBlock)
{
pBlock();
cout << "The type is: " << typeid(T).name() << endl;
}
static void Hi(void)
{
NSLog(@"Hi, there!");
}
int main(int argc, const char* argv[])
{
BlockTest(Hi);
}
这段代码展示了整个函数指针类型演绎出模板实参。对于目前已被很多编译器所实现的Lambda表达式,这是与泛型挂钩的唯一桥梁,那么Blocks是否具备这个特性呢?
#import <Foundation/Foundation.h>
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
void BlockTest(T pBlock)
{
pBlock();
cout << "The type is: " << typeid(T).name() << endl;
}