Ситуация: я кодирую COM-интерфейс в виде
MIDL_INTERFACE(/*....*/)
IFace : IUnknown
{
STDMETHOD_(void, Foo)(int param) PURE;
};
Предполагается, что интерфейс используется только внутри моего проекта, в нескольких единицах компиляции, а не в файле idl. int param
предполагается использовать в"OR"
путь
IFace* p;
p->Foo( param1 | param2 | param3 );
Список значений параметров статически предопределен и не должен изменяться во время выполнения программы.
Вопрос: как определить список параметров? IFace
описание интерфейса должно быть помещено в файл, уже содержащий множество описаний интерфейсов (сложное наследие), этот файл включен во многие места по всему проекту. Итак, я хотел бы иметь определение списка параметров внутри самого класса интерфейса.
IFace : IUnknown
{
/*somehow define list of param for Foo here*/
STDMETHOD_(void, Foo)(int param) PURE;
};
И использовать его таким образом, Foo( IFace::param1 | IFace::param2 );
, Я думаю о том, чтобы сделать список параметров как static const
переменные, но мне не нравится идея разместить переменные в интерфейсном классе. Я не могу сделать это с помощью enum, потому что мне нужно это с помощью логического ИЛИ.
Какие-нибудь хорошие советы в этой ситуации, кроме полной реорганизации включаемых файлов?
Вы можете использовать перечисления:
IFace : IUnknown
{
enum { Param1 = 0x1, Param2 = 0x2, Param3 = 0x4, Param4 = 0x8 ... etc.
STDMETHOD_(void, Foo)(int param) PURE;
};
// usage
Foo( IFace::Param1 | IFace::Param2 );
Вы можете добавить комбинацию параметров:
enum { Param1 = 0x1, Param2 = 0x2, Param1_and_2 = Param1 | Param2, ... etc.
//usage
Foo( IFace::Param1_and_2 );
Других решений пока нет …