#include <cstdio>
#include <cstdlib>
#include <cassert>

#define SIZE 200

struct Hoge
{
void operator [] (unsigned idx) { assert(idx < SIZE); std::puts("...do something..."); }
void operator [] (signed idx) { assert(0 <= idx); (*this)[static_cast<unsigned>(idx)]; }
};

int main(void)
{
Hoge hoge;
hoge[100];
// hoge[-1];
// hoge[200];
system("pause");
return 0;
}

ていうかこれでいいじゃん
既存のコードをいちいちラップするのメンドクセーけどさ