Boost.python с универсальной ссылкой / совершенной пересылкой?

Я экспериментировал с универсальными ссылками на C ++ 11 и совершенной пересылкой в ​​некоторых классах, к которым также необходимо получить доступ из Python с использованием Boost.Python. У меня есть код, который работает, но он требует некрасивой специализации шаблона вне класса. Кто-нибудь решил это более элегантно? У кого-нибудь есть предложения по улучшению следующего кода?

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

using namespace boost::python;

struct A {
A() : _a("initial") {}

template <typename T>
void set_a(T&& a) { _a = std::forward<T>(a); }

const std::string& get_a() const { return _a; }

private:
std::string _a;
};

// How can the following template member function specialization be avoided?
template <>
void A::set_a(const std::string& a) { _a = a; }

BOOST_PYTHON_MODULE(example)
{
class_<A>("A")
.add_property("a", make_function( &A::get_a, return_value_policy<copy_const_reference>()),
&A::set_a<const std::string&>) // Can this be defined differently?
;
}

3

Решение

Я экспериментировал сегодня и нашел, что ответ на самом деле довольно прост. Просто используйте make_function () снова в части setr add_property:

Вот упрощенный код:

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

using namespace boost::python;

struct A {
A() : _a("initial") {}

template <typename T>
void set_a(T&& a) { _a = std::forward<T>(a); }

const std::string& get_a() const { return _a; }

private:
std::string _a;
};

BOOST_PYTHON_MODULE(example)
{
class_<A>("A")
.add_property("value",
make_function( &A::get_a, return_value_policy<copy_const_reference>()),
make_function( &A::set_a<const std::string&> )
);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]