
Using an empty struct instead of void* to represent the opaque filter and filter session types, means that C++ filter types simply can derive from them. That brings conceptual clarity and also means that the C++ instances can be returned from the module callbacks without casts. When provided as argument they can be downcast using static_cast instead of reinterpret_cast. Similar types to be provided for routers.