Я пытаюсь создать привязки Python для некоторых функций C ++, используя pybind11.Функции являются шаблонными, но в привязках python мне нужен один из параметров шаблона, чтобы быть аргументом функции.В настоящее время у меня есть много повторений для каждого параметра шаблона.
enum MyEnum {E1, E2, E3};
template<typename T, MyEnum E>
returnType templFunction(int arg){
<function body>
}
PYBIND11_MODULE(moduleName, m){
m.def("pyFunction1", [](int arg, MyEnum e){
switch(e){
case MyEnum::E1: return templFunction<templParam1, E1>(arg);
case MyEnum::E2: return templFunction<templParam1, E2>(arg);
case MyEnum::E3: return templFunction<templParam1, E3>(arg);
default: throw std::invalid_argument("Unknown enum type ...");
}
});
m.def("pyFunction2", [](int arg, MyEnum e){
switch(e){
case MyEnum::E1: return templFunction<templParam2, E1>(arg);
case MyEnum::E2: return templFunction<templParam2, E2>(arg);
case MyEnum::E3: return templFunction<templParam2, E3>(arg);
default: throw std::invalid_argument("Unknown enum type ...");
}
});
// for template type temlParam3, only E1 and E2 are valid enums
m.def("pyFunction3", [](int arg, MyEnum e){
switch(e){
case MyEnum::E1: return templFunction<templParam3, E1>(arg);
case MyEnum::E2: return templFunction<templParam3, E2>(arg);
default: throw std::invalid_argument("Unknown enum type ...");
}
});
// more specializations like above
};
Есть ли хороший способ сделать функцию более высокого порядка, чтобы мне не нужно было много повторяющегося кода?
У меня также есть другие функции с аналогичными сигнатурами и параметрами шаблона.Поэтому в идеале я хотел бы передать дескриптор функции (или имя функции) и один из параметров шаблона в «мета-функцию», которая может генерировать специализации на основе enum и заданных параметров шаблона.
Примечание: Iиметь статический атрибут для каждого из типов шаблонов (templParam1
, templateParam2
, ...), который определяет допустимые типы перечисления для этого параметра шаблона.Например, templParam1::allowedEnumTypes = std::vector<myEnum> { E1, E2, E3 };