こんなもんベタベタ貼っ付けてblogが成立するもんじゃろかと思いつつ、
面白がる酔狂な輩もいるに違いない。 で、バインダにちょーせん:
namespace orient {
// 2数を与えてboolを返すdelegate
generic<typename T1, typename T2>
public
delegate bool Predicate2(T1,T2);
// 第一引数をbindするbinder
generic<typename T1, typename T2>
public
ref class Binder1stPredicate {
private:
T1 bind_;
Predicate2<T1,T2>^ pred_;
public:
Binder1stPredicate(Predicate2<T1,T2>^ pred, T1 bind)
: pred_(pred), bind_(bind) {}
property System::Predicate<T2>^ evaluator {
System::Predicate<T2>^ get() {
return gcnew System::Predicate<T2>(this, &Binder1stPredicate::evaluate);
}
}
bool evaluate(T2 arg) { return pred_(bind_, arg); }
static
System::Predicate<T2>^
make(bool (*ptr_fun)(T1,T2), T1 bind) {
return (gcnew Binder1stPredicate(gcnew Predicate2(ptr_fun), bind))->evaluator;
}
};
}
なんてなバインダをこしらえとけば、素数表は↓こうなるな、と。
// xはyで割り切れる
bool CanDivide(int x, int y) { return x % y == 0; }
int main() {
const int N = 10000;
System::Collections::Generic::List<int> primes;
primes.Add(2);
System::Console::Write("{0,8}", 2);
for ( int i = 3; i < N; i += 2 ) {
// CanDivideにiをバインドしてPredicateを生成するなり
if ( !primes.Exists(orient::Binder1stPredicate<int,int>::make(&CanDivide,i)) ) {
primes.Add(i);
System::Console::Write("{0,8}", i);
}
}
return 0;
}
…くだらんことやっとるが、VS2005にSTL.NETが間に合わんかったのが遠因。