Я экспериментировал с универсальными ссылками на 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?
;
}
Я экспериментировал сегодня и нашел, что ответ на самом деле довольно прост. Просто используйте 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&> )
);
}
Других решений пока нет …