У меня есть класс c ++, который предоставляет коллекции, предоставляя функции, возвращающие диапазоны, используя boost::range
.
Чтобы экспортировать этот класс в python с boost::python
, я использую функцию boost::python::range
, котораяможет принимать два параметра: функции-члены класса, возвращающие итераторы начала и конца коллекции.
Я хочу избежать написания пар начала / конца вручную для каждой коллекции, так как я уже предоставляю диапазон.Но мне не удается написать обертку над boost :: python :: range, принимая в качестве аргумента функцию-член, возвращающую диапазон.Есть идеи?(На самом деле у меня есть несколько классов, которые шаблонизированы, поэтому функция шаблона, принимающая в качестве параметра шаблона адрес функции-члена класса шаблона, не будет работать, сказал мой компилятор)
Я примурешение c ++ 0x, если оно скомпилировано с g ++ - 4.6.
edit: пример кода в ответ на вопрос: скажем, у меня есть этот класс:
struct A
{
std::vector<int> c;
typedef boost::sub_range<std::vector<int> > c_range;
c_range getc() { return c; }
};
Для создания итератора Python из getc
метод, я теперь добавляю эти две функции-члены в класс A:
c_range::iterator c_begin() { return getc().begin(); }
c_range::iterator c_end() { return getc().end(); }
и затем выставляю их так:
boost::python::class_<A>("A")
.def("getc", boost::python::range(&A::c_begin, &A::c_end));
Есть ли способ написать что-то вроде:
.def("getc", pyrange(&A::getc));
и чтобы избежать необходимости писать c_begin
и c_end
?