Exporting wrapped functions doesn't work

Aperta
#466 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
cpp
Ambito
api

Direzione di ricerca

Inizia riproducendo gli esempi di funzioni wrappate presenti nell’issue, quindi esamina l’entry point boost::python::def e la gestione degli oggetti richiamabili. Il lavoro è completato quando gli esempi wrappati add2 e add possono essere esportati correttamente, come i casi che funzionano già direttamente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

I find myself in need of exporting a whole lot of functions to Python which require a wrapper (the API needs locking and whatnot).

The following code probably should work (pybind11 can handle it, for the most part), but doesn't.

#include <iostream>
#include <boost/python.hpp>

template <class R, class... Args>
struct wrap
{
    using funct_type = R(*)(Args...);
    funct_type func;
    wrap(funct_type f): func(f) {};
    R operator()(Args&&... args)
    {
          std::cout << "before calling\n";
          R ret=func(std::forward<Args>(args)...);
          std::cout << "After calling\n";
          return ret;
    }
};

class bar {};
class foo : bar {
    public:
    enum xfoo { FOO=1, BAR=2, BAZ=3    };
    static int add(int a, int b, enum xfoo c) { return a+b; }
    static int add2(int a, int b) { return a+b; }
};

BOOST_PYTHON_MODULE(example)
{
    using namespace boost::python;

    // this works
    std::cout << "Result" << wrap{foo::add}(1,2, foo::xfoo::FOO) << std::endl;

    // so does this
    def("add", foo::add, "A function that adds two numbers and no enum");

    // this works with pybind11 but not boost
    def("add2", wrap{foo::add2}, "A function that adds two numbers");

    // this works with neither
    def("add", wrap{foo::add}, "A function that adds two numbers and no enum");
}
Lingua principale
C++
Stelle
537
Fork
223
Merge medio
11h 22m
PR unite (30g)
2

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di boostorg/python

Tutte le issue di boostorg/python

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.