我有以下模板类声明:
template<void f(int)>
class A{
public:
A(){
struct sigaction sigact;
...
if(sigact.sa_handler != f){
...
}
};
}
你能告诉我这种模板叫什么吗?这个模板有什么好处?声明此类安装信号处理程序,该处理程序作为f(int)传递。每当我们创建这个类的实例时,都会安装信号处理程序。我理解功能模板和类模板。什么是这个模板?我不知道为什么以这种方式有什么好处?
答案 0 :(得分:2)
模板是参数化类型。在您提到的情况下,名称A
指的是一系列类型,每个类型对应于您传递给它的void f(int)
形式的每个函数。因此,给出以下声明:
void print_int(int x);
void close_file(int x);
void handle_signal(int x);
A<print_int> p;
A<close_file> c;
A<handle_signal> s;
变量p
,c
和s
具有不同(但相关)的类型,只有在以前使用的函数中,才会输入您在上面突出显示的if
块实例化模板 NOT 与sigact.sa_handler
指向的模板相同。
答案 1 :(得分:0)
这是一种使类调用不同函数的机制,具体取决于它是如何创建的。如果使用返回true
的函数创建类,则您的类将表现不同,因为它传递的函数返回类型sigaction
的结构。
如何使用这种灵活性是一个更大的问题,取决于您的创造力和您的要求。在您的示例中,您指定您传递的函数将返回void
,这可能在您使用它的上下文中不太理想,因为您正在使用它与其他东西比较。但请记住,模板允许这种东西。
这可能也是偶数主题的一部分: Policy-based design 。
想想polymorphism。使用该类,您可以将任何类型的函数作为参数传递,通过使函数一等公民(这意味着您可以)有效地使C ++尽可能接近functional language直接将它们作为参数传递给其他函数,没有函数指针或委托,也不依赖于lambdas。)
整个'strategy' design pattern遵循同样的方法。在original book上,一个示例暗示使用templates而不是基于继承的多态,这会导致更清晰,更快速的方法,失去一些灵活性(模板的缺点是你需要知道的如何在运行之前使用类。
希望这有点清楚,尝试阅读链接,这将是非常具有说明性的! =)