函数作为模板类中的参数

时间:2014-05-07 14:32:03

标签: c++ templates

我有以下模板类声明:

template<void f(int)>
class A{
public:
    A(){
        struct sigaction sigact;
        ...
        if(sigact.sa_handler != f){
            ...
        }
    };
}

你能告诉我这种模板叫什么吗?这个模板有什么好处?声明此类安装信号处理程序,该处理程序作为f(int)传递。每当我们创建这个类的实例时,都会安装信号处理程序。我理解功能模板和类模板。什么是这个模板?我不知道为什么以这种方式有什么好处?

2 个答案:

答案 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;

变量pcs具有不同(但相关)的类型,只有在以前使用的函数中,才会输入您在上面突出显示的if块实例化模板 NOT sigact.sa_handler指向的模板相同。

答案 1 :(得分:0)

这是一种使类调用不同函数的机制,具体取决于它是如何创建的。如果使用返回true的函数创建类,则您的类将表现不同,因为它传递的函数返回类型sigaction的结构。

如何使用这种灵活性是一个更大的问题,取决于您的创造力和您的要求。在您的示例中,您指定您传递的函数将返回void,这可能在您使用它的上下文中不太理想,因为您正在使用它与其他东西比较。但请记住,模板允许这种东西。

这可能也是偶数主题的一部分: Policy-based design

想想polymorphism。使用该类,您可以将任何类型的函数作为参数传递,通过使函数一等公民(这意味着您可以)有效地使C ++尽可能接近functional language直接将它们作为参数传递给其他函数,没有函数指针或委托,也不依赖于lambdas。)

整个'strategy' design pattern遵循同样的方法。在original book上,一个示例暗示使用templates而不是基于继承的多态,这会导致更清晰,更快速的方法,失去一些灵活性(模板的缺点是你需要知道的如何在运行之前使用类。

希望这有点清楚,尝试阅读链接,这将是非常具有说明性的! =)

相关问题