- 论坛徽章:
- 14
|
如果希望cmp是个模板类,且完全隐式推导的话:
#include <string>
class CTest
{
public:
CTest( int i=0 ) : i_(i)
{
}
CTest( const char* s ) : i_(0), str_(s)
{
}
CTest( int i, const char* s ) : i_(i), str_(s)
{
}
int get_i() const
{
return i_;
}
const std::string& get_str() const
{
return str_;
}
private:
int i_;
std::string str_;
};
template<class T,typename V>
struct cmp
{
cmp( V (T::*pmf)() const, V val ) : pmf_(pmf), val_(val)
{
}
bool operator()( const T& t ) const
{
return (t.*pmf_)() == val_;
}
private:
V (CTest::*pmf_)() const;
V val_;
};
template<class T,typename V>
cmp<T,V> makecmp( V (T::*pmf)() const, V val )
{
return cmp<T,V>( pmf, val );
}
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
vector<CTest> vTest;
for( int i=0; i<10; ++i )
{
char sz[100];
sprintf(sz, "%d", i+100);
vTest.push_back( CTest(i,sz) );
}
for( vector<CTest>::iterator it=vTest.begin(); it!=vTest.end(); ++it )
{
printf( "i=%d\tstr=%s\n", it->get_i(), it->get_str().c_str() );
}
cout << "---------------" << endl;
vector<CTest>::iterator it = find_if( vTest.begin(), vTest.end(), makecmp(&CTest::get_i, );
if( it == vTest.end() )
printf( "%s", "not found\n" );
else
printf( "i=%d\tstr=%s\n", it->get_i(), it->get_str().c_str() );
return 0;
} |
|