On 01/30/2012 07:28 PM, Jim Bosch wrote:
> On 01/30/2012 12:11 PM, Michael Wild wrote:
>> That's what I've been referring to as "auxiliary" functions. If
>> possible, I'd like to avoid them because I don't fancy writing hundreds
>> of those... I could live with calling a template. However, so far I
>> haven't been able to come up with one that is sufficiently easy to use...
>>
>> So far I came up with the this:
>>
>> template<class ArgType, class T, T&(C::*method)()>
>> void set_helper(T&  self, ArgType&  arg)
>> {
>>    (self.*method)() = arg;
>> }
>>
>> But it is a bit cumbersome to use, as it doesn't deduce its first two
>> template arguments on its own. Is there any way to achieve that feat?
>>
> 
> If you're up for playing with Boost.FunctionTypes, you should be able to
> write a wrapper for make_function that deduces those types for you:
> 
> namespace bp = boost::python;
> 
> template <typename A, typename T, A&(T::*method)()>
> void set_helper(T & self, A const & arg) {
>     (self.*method)() = arg;
> }
> 
> template <class F>
> bp::object make_set_helper(F f) {
>     // F is the member function type; use Boost.FunctionTypes to
>     // figure out A and T, then...
>     return bp::make_function(&set_helper<A,T,f>);
> }
> 
> 
> I'll leave it to you to fill in the details.  I haven't tried it myself,
> but I think it would work.
> 
> 
> Jim

Thanks for that hint, I'll certainly take a look. The only think that
would bother me with this solution is that I would need to disambiguate
between the non-const and const functions with the casting operator again.

Michael
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to