用于函数签名的专用模板
Specialized template for function signature
在该测试代码中:
#include <string>
#include <iostream>
using namespace std;
template <typename T> class Signal;
template <typename T, typename U>
class Signal<T (U)>
{
public:
Signal<T (U)>(T (*ptr)(U))
{
}
};
void Print(string const& str)
{
cout << str << endl;
}
int main(int argc, char *argv[])
{
Signal<void (string const&)> sig = &Print;
return 0;
}
为什么我必须写template <typename T> class Signal;
?
为什么我必须指定它?
您不必做您正在做的事情,但这是最灵活的方法。具有专用化的单参数模板如下所示:
- 在
一种类型上参数化的模板...
template <typename> struct Foo;
。但它只为函数类型定义:
template <typename R> struct Foo<R()> { /* ... */ }; template <typename R, typename A1> struct Foo<R(A1)> { /* ... */ }; template <typename R, typename ...Args> struct Foo<R(Args...)> { /* ... */ };
另一种方法是对函数的签名进行硬编码:
-
存储单参数函数的函数指针的类模板:
template <typename R, typename A> struct Bar { R (*fp)(A); Bar(R(*f)(A)) : fp(f) { } // ... };
如您所见,第一种方法要通用得多,因为我们可以针对我们喜欢的任何函数类型专门Foo
。相比之下,第二个示例中的直接模板与函数签名的细节错综复杂地联系在一起,不容易概括。
您正在创建Signal
的专用化,它将任意类型T
和U
组合成T(U)
形式。这被放在一起作为专用化Signal<T(U)>
:参数中只有一个类型,这就是为什么我们向前声明Signal
只采用一种类型T
。如果没有该声明,这是不可能的。
下面是一个简单的示例:
template <typename T> struct A;
template <typename T, typename U> struct A<T(U)> {
};
int main() {
A<void(int)> a;
}
void
和int
类型分别绑定到T
和U
的类型。这被组合到A
的主要声明中使用的类型void(int)
中,以专门化类。
相关文章:
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 如何使专用函数模板成为某个类的朋友?
- 如何按类型为元组元素创建专用函数
- 无法访问专用函数
- 使用指向部分专用函数成员的指针自动填充向量
- 64 位 G++ 4.6.3 不会在专用函数模板中将长整型视为长整型,即使它们的大小相同。这是一个错误吗?
- 操作员过载的专用函数
- C++调用模板专用函数
- 模板类中专用函数的声明
- 使用专用函数对异构集合的 STL 算法
- C++专用函数-不在此范围内错误
- 为什么我不能专用函数模板?
- 用于专用函数参数的模板
- 代码重复和模板专用化(当专用函数具有不同的返回类型时)
- 具有专用函数的Pull-Apart函数类型
- 专用函数模板