Упаковка унаследованных шаблонов в Cython? - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь написать оболочку для некоторых шаблонных кодов C ++.Я довольно знаком с упаковкой чего-то написанного как Бар.т.е. (с удаленными деталями)

 ctypedef enum enum_t "enum_t":
    OPT1 "OPT1",
    OPT2 "OPT2",
    OPT3 "OPT3"

 cdef cppclass Bar[A, B, T, ALLOCATOR=*] 

 new Bar[OPT1, OPT2, float]

Но у меня возникают проблемы с пониманием того, что такое практика для упаковки экземпляров чего-то вроде Bar<OPT1, OPT2, T> or Bar<OPT3, OPT4, T>, определенного ниже.Может ли кто-нибудь указать мне правильное направление?То, что я пробовал, дало мне ошибку «OPT1 is неоднозначно» при компиляции.

typedef enum
{
  OPT1, 
  OPT2,
  OPT3,
} enum_t;

template<class T, class Allocator = std::allocator<T> >
class BarBase : public Foo<T, Allocator>, public mpi::MPIObject
{
  //Generic class methods and variables
}

template<enum_t A, enum_t B, class T, class Allocator = std::allocator<T> >
    class Bar : public BarBase<T, Allocator>
    {
      public:
      private:
    };

template<typename T>
class Bar<OPT1, OPT2, T> : public BarBase<T>
    {
      //Specific class methods here
    }

template<typename T>
class Bar<OPT3, OPT4, T> : public BarBase<T>
    {
      //Specific class methods here
    }

1 Ответ

0 голосов
/ 10 марта 2019

Cython на самом деле не поддерживает нестандартные параметры шаблона. В предыдущих вопросах при использовании параметров шаблона int я рекомендовал использовать «поддельные» классы с именами, подписанными для создания правильного кода C ++. Тот же принцип применяется здесь:

cdef extern from "X.hpp":        
    cdef cppclass OPT1:
        pass
    cdef cppclass OPT2:
        pass

    cdef cppclass Bar[A, B, T]:
        pass

def f():
    cdef Bar[OPT1,OPT2,float]* p = new Bar[OPT1,OPT2,float]()

Я просто сказал Cython, что OPT1 и OPT2 являются классами, а не значениями enum, и это помогает Cython генерировать правильный код.

...