就目前而言,除了“语法错误”之外,它并不意味着什么。例如:
template<T, Op>
这根本是不允许的。对于每个模板参数,您需要指定它是类型(使用class
或typename
)还是非类型参数,例如int
. 由于明显的意图是这两个都应该是类型参数,因此您需要以下内容:
template <class T, class Op>
或者:
template <typename T, typename Op>
class
对于这种情况,和之间的含义没有区别typename
。
struct bind{
T v;
保持未v
初始化将导致未定义的行为,因此您可能不想允许这样做。您通常会通过添加一个以 T 作为其参数并初始化v
为该值的构造函数来防止它:
bind(T const &v) : v(v) {}
当您包含这样的构造函数时,编译器不会自动生成默认构造函数,因此不再可能创建未初始化的bind
对象v
——这正是我们想要的。
虽然创建comp
对象:
Op comp;
是相当无害的,它也完全没有必要。您也可以与使用 创建的临时实例进行比较Op()
,在这种情况下:
bool operator()(const T& a){
return comp(a,v);
}
...会变成这样(并且Op comp;
简单地删除):
bool operator()(T const &a) {
return Op()(a, v);
}
即使进行了更正,我仍认为此代码已过时。在 C++98/03 中,它在需要为算法提供函子的情况下会很有用,例如:
std::remove_copy_if(a.begin(), a.end(), bind<int,
std::back_inserter(b),
bind<int, std::less<int> >(5));
...这会将数字从 复制a
到b
,删除小于 5 的数字。
然而,在 C++11 中,它的大多数(如果不是全部)使用bind
可能应该写成 lambda,所以上面的代码会变成这样:
std::remove_copy_if(a.begin(), a.end(), bind<int,
std::back_inserter(b),
[](int x) { return x < 5; });
这不仅更短,而且(至少一旦你习惯了它)比使用std::less
和bind
组合一个函数要简单得多。它通常不会对运行时效率产生任何影响——lambda 基本上是一种生成类模板的“速记”方式,因此它生成的内容最终与使用bind
.