我一直在尝试使用C ++ 11通用引用,并在某些类中进行完美转发,这些类也需要使用Boost.Python从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?
;
}
答案 0 :(得分:1)
我今天做了一些实验,发现答案其实非常简单。只需在add_property的setr部分再次使用make_function():
以下是简化代码:
#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&> )
);
}