gpt4 book ai didi

c++ - 模板仿函数与函数

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

我一直在查看一些 Boost 源代码并注意到它们通过使用仿函数而不是普通函数来实现模板化函数?这是有原因的吗?

例如:

template<typename Foo, typename Bar>
struct functor {
Bar operator()(const Foo& foo) {
return foo.as_bar();
}
};

相对于:

template<typename Foo, typename Bar>
Bar func(const Foo& foo) {
return foo.as_bar();
}

我能想到的唯一优点是它允许类继承函数?

最佳答案

主要有两个原因:首先,正如 pythonic 隐喻所指出的,偏特化只对类有效,对函数无效。请注意,函数通常可以使用重载来克服这个问题,但如果您正在进行元编程,通常使用部分特化会更容易和更通用。我实际上认为这是主要原因。

第二个原因是,任何时候代码想要接受一个函数对象(比如在 STL 中,例如 std::transform),它都会有一个类型模板参数。如果你传递一个仿函数或一个 lambda,确切的类型在编译时是已知的,你不需要为间接性付出代价,并且可以执行内联。如果您传递函数指针(或 std::function),则在编译时只有签名是已知的,并且您需要支付间接费用(并且不能内联)。例如,std::sort 使用仿函数比使用函数指针要快得多。

请注意,有一个被称为函数指针模板参数的小功能;这些是专门针对特定功能的非类型模板参数,因此可以消除间接性。但是,如果您使用其中之一,则根本无法使用仿函数。因此,大多数想要接受函数对象的代码都按照我上面描述的方式进行。

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

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