I tried that approach - it was one of those all-to-common C++ scenarios where I had finished coding and had fixed up almost all the compile errors, before a final "cannot access non-static class member variable from static class method" error sounded the death knell for the whole approach (and gave me a migraine).

Unfortunately the signal handler callback has to be static and the UNIX signal handling framework provides no mechanism for passing a context parameter to a signal handler, so the usual "create thread per class instance" idiom of passing the class instance pointer as the context parameter won't work.  I therefore needed a unique signal handler callback and unique semaphore per hooked signal and the only way I could think of to do this was templating.  I actually felt quite pleased with myself for coming up with this!