正如 juanchopanza 指出的那样,正如您在 c++11 中的这个问题中看到的那样,这个问题不再存在,所以如果可能的话,这可能是最好的方法。
如果不是,我想出了一个解决方案,如果你有少量类型的本地类(例如比较器,也许还有更多),你可能会很有用。我在前面提到的 SO 问题中举了一个例子,并对其进行了修改,使其可以在 C++03 下工作:
#include <iostream>
#include <vector>
#include <algorithm> // std::remove_if
using namespace std;
template <typename T>
class check {
public:
virtual bool operator()(T x) = 0;
};
template <typename T>
struct cheat {
cheat(check<T> *c) {_c = c;}
bool operator()(T x) {return _c->operator ()(x);}
check<T> *_c;
};
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> v( array, array+10 );
class even : public check<int>
{
public:
virtual bool operator()( int x ) { cout<<"Hi"<<endl; return !( x % 2 ); }
};
even e;
remove_if( v.begin(), v.end(), cheat<int>(&e)); // no error, prints Hi
return 0;
}
同样在https://ideone.com/HY5bIU(用 Wall 编译,也很迂腐......)
例如,如果我想在我的代码中使用很多一元运算符,我可以创建一个抽象类,以便我的所有运算符都继承它,并且我创建了一个cheat
基本上只用于帮助调用本地类的类.
编辑:另一个印记稍小的选项:
#include <iostream>
#include <vector>
#include <algorithm> // std::remove_if
using namespace std;
template <typename T>
class check {
public:
virtual bool operator()(T x) = 0;
struct aid{
aid(check *p){ _c = p;}
check *_c;
bool operator()(T x){
return _c->operator ()(x);
}
};
aid retMe(){
return aid(this);
}
};
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> v( array, array+10 );
class even : public check<int>
{
public:
virtual bool operator()( int x ) { cout<<"Hi"<<endl; return !( x % 2 ); }
};
even e;
remove_if( v.begin(), v.end(), e.retMe()); // no error
return 0;
}
https://ideone.com/6SZ4UH
这里的aid
类隐藏在抽象类本身内部,但是思路是一样的。
它确实添加了一些不必要的代码,但另一方面,它并不像某些 hack 那样怪诞。