Con*_*uit 3 c++ templates c++11
在std::function类模板以这样的方式,当我们希望它包裹类似下面的功能:
void printInt(int integer)
{
std::cout << int << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我们使用std::function<void(int)>。直到最近,我还以为这是该类的一个细微差别,但是我在C ++中搜索委托实现时发现的一个类使用了类似的语法。
到底是 void(int)什么,我们用技术术语称之为什么?这似乎是在codepeak 中说“ 带一个int并返回void的函数 ”的标准方法,但是我的直觉告诉我,这简直太过简单了。
其次,我注意到当我看到使用此语法的模板时,它们使用可变参数模板来匹配多个功能签名。从上面的链接:
template <typename T> class delegate;
template<class R, class ...A>
class delegate<R (A...)>
{
...
Run Code Online (Sandbox Code Playgroud)
为什么要声明这样的功能而不是简单地使用以下内容?
template<class R, class ...A>
class delegate
{
...
Run Code Online (Sandbox Code Playgroud)
模板参数to std::function<Signature>只是函数的类型,即其签名。它使用与任何函数声明相同的符号,只是未命名且名称被忽略。您可能遇到过使用相同符号的函数指针,但是函数签名用于指针。
使用模板专门化实现的原因std::function<Signature>(显然是delegate<Signature>)是为了产生更好的类型:
template <typename T> class function;
template <typename R, typename... Args>
class function {
public:
R operator()(Args...);
// ...
};
template <typename R, typename... Args>
class other {
public:
R operator()(Args...);
// ...
};
int main() {
function<int(double, char)> f;
other<int, double, char> o;
}
Run Code Online (Sandbox Code Playgroud)
由于的主要模板function<T>采用一种类型作为参数,因此使用专门化,参数可以是普通的函数类型。另一方面,没有这样做other<T...>,因此无法获得类型列表。
值得一没有什么std::function<T>对象可以被周围很容易,而不需要处理许多模板参数传递:因为函数的签名只是一个类型,这个类模板只需一个模板参数。
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |