gpt4 book ai didi

c++ - 函数签名的专用模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:56 25 4
gpt4 key购买 nike

在该测试代码中:

#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 专门化为我们喜欢的任何 函数类型。相比之下,第二个示例中的直接模板与函数签名的细节错综复杂地联系在一起,不易泛化。

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

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