Мне нужно создать привязки Python для базы кода C ++. Использую boost :: python, и я столкнулся с проблемами, пытаясь открыть классы, содержащие функции, использующие и возвращающие шаблоны. Вот типичный пример
class Foo
{
public:
Foo();
template Foo& setValue(
const string& propertyName, const T& value);
template const T& getValue(
const string& propertyName);
};
Типичные T - это строка, двойное число, вектор.
Прочитав документацию , я попытался использовать тонкие оболочки для каждого используемого типа. Вот оболочки для строковых и двойных и соответствующее объявление класса.
Foo & (Foo::*setValueDouble)(const std::string&,const double &) =
&Foo::setValue;
const double & (Foo::*getValueDouble)(const std::string&) =
&Foo::getValue;
Foo & (Foo::*setValueString)(const std::string&,const std::string &) =
&Foo::setValue;
const std::string & (Foo::*getValueString)(const std::string&) =
&Foo::getValue;
class_("Foo")
.def("setValue",setValueDouble,
return_value_policy())
.def("getValue",getValueDouble,
return_value_policy())
.def("getValue",getValueString,
return_value_policy())
.def("setValue",setValueString,
return_value_policy());
Он компилируется нормально, но когда я пытаюсь использовать привязки python, я получаю исключение C ++.
>>> f = Foo()
>>> f.setValue("key",1.0)
>>> f.getValue("key")
Traceback (most recent call last):
File "", line 1, in ?
RuntimeError: unidentifiable C++ exception
Интересно, когда я выставляю Foo только для двойных или строковых значение, т.е.
class_("Foo")
.def("getValue",getValueString,
return_value_policy())
.def("setValue",setValueString,
return_value_policy());
Работает нормально. Я что-то упустил?