gpt4 book ai didi

c++ - C++ 模板中的函数签名

转载 作者:太空狗 更新时间:2023-10-29 20:39:44 29 4
gpt4 key购买 nike

std::function类以这样的方式模板化,当我们希望它包装如下函数时:

void printInt(int integer)
{
std::cout << int << '\n';
}

我们使用 std::function<void(int)> .直到最近我还认为这是类(class)的一个奇怪的细微差别,但是a class I found在 C++ 中搜索委托(delegate)实现时使用类似的语法。

究竟是什么 void(int) ,我们用技术术语怎么调用它?这似乎是用代码语言表达“一个接受 int 并返回 void 的函数”的标准方式,但我的直觉告诉我这过于简单化了。

其次,我注意到当我看到使用这种语法的模板时,它们使用可变参数模板来允许匹配多个函数签名。从上面的链接:

template <typename T> class delegate;

template<class R, class ...A>
class delegate<R (A...)>
{
...

这样声明函数而不是简单地使用以下函数的原因是什么:

template<class R, class ...A>
class delegate
{
...

最佳答案

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;
}

function<T> 的主要模板以来将一个类型作为参数,使用特化参数可以是普通函数类型。另一方面,other<T...> 没有做同样的事情。因此,它获得了一个类型列表。

std::function<T> 一文不值对象可以很容易地传递,而不需要处理许多模板参数:因为函数的签名只是一种类型,所以这个类模板只需要一个模板参数。

关于c++ - C++ 模板中的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792750/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com