就目前而言,除了“语法错误”之外,它没有任何意义。例如:
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; });
这不仅更短,而且(在lea一旦你习惯了它)比使用std::less
和bind
将功能放在一起简单得多。它通常不会在运行时效率上产生任何影响 - lambda基本上是生成类模板的“简写”方式,所以它生成的结果与使用bind
的代码非常相似。