Я использую boost::python
для создания оболочки Python библиотеки C ++. В какой-то момент boost::python
нужен указатель на функцию-член (или что-то совместимое), например:
template <class MyClass, typename ValueType>
void (*setter_function)(MyClass&, ValueType)
// This doesn't compile, but you got the idea.
my_boost_python_call(setter_function f);
Так как класс, который я упаковываю, имеет свой установщик в следующем виде:
template <class MyClass, typename ValueType>
MyClass& (MyClass::*setter_method)(ValueType)
Я написал одну функцию преобразования:
template <typename MyClass, typename ValueType, setter_method<MyClass, ValueType> fluent_setter>
void nonfluent_setter(MyClass& instance, ValueType value)
{
(instance.*fluent_setter)(value);
}
Что я могу использовать так:
class Foo
{
public:
Foo& bar(int value);
};
my_boost_python_call(nonfluent_setter<Foo, int, &Foo::bar>);
Пока это работает хорошо, но мне интересно, есть ли способ сделать это еще более "легким" (использовать).
Как вы думаете, возможно ли получить что-то вроде:
// return type is somehow inferred from the member function pointer
my_boost_python_call(nonfluent_setter<Foo, &Foo::bar>);
// or even a syntax similar to boost::python::make_function
my_boost_python_call(make_nonfluent_setter<Foo>(&Foo::bar));
Все решения (даже те, которые объясняют, как специализировать boost::python
для обработки моего конкретного случая) приветствуются.
Спасибо.