gpt4 book ai didi

c++ - 将函数传递给模板时使用函数指针或对象有什么区别?

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

假设我想实现 std::find_if来自 <algorithm> .这是我尝试过的一种可行方法。

template <class In, class F>
In find_if(In b, In e, F f)
{
while (b != e)
{
if (f(*b))
return b;
b++;
}
return e;
}

在这里,用户似乎需要知道传递一个返回 bool 的参数。值(value)。我的部分问题是关于是否有任何方法可以限制传递给 F f 的内容使用这种技术。

另一种实现方法是使用函数指针:

template <bool (*F)(int), class In>
In find_if(In b, In e)
{
while (b != e)
{
if (F(*b))
return b;
b++;
}
return e;
}

这两种方法之间是否有任何区别(除了必须调用它们的方式;即第一种方式是用 find_if(arg1,arg2,f) 调用的,第二种方式是用 find_if<f>(arg1,arg2) 调用的。

如果有不同,能否请您描述并解释给我听?

最佳答案

传递函数指针比传递我们在其上应用 (*b) 的类型更具限制性。

就类(class)而言,你可能会通过

  • 仿函数类(可能有状态)为:

    struct HasName {
    explicit HasName(const std::string& name) : name(name) {}

    template <typename T>
    bool operator () (const T& t) const { return t.get_name() == name; }

    std::string name;
    };
  • f(*b) 正确的任何函数指针(因此 f 可以采用 float ,而 *b 是一个int,例如)。

  • 或 lambda (C++11)。

关于c++ - 将函数传递给模板时使用函数指针或对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21076250/

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