微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用boost包装多个派生模板类

如何解决如何用boost包装多个派生模板类

我需要用boost包装一些从另一个派生的模板类。 首先,我有一个模板类ValueAndUnit,其部分代码为:

template <class T>
class ValueAndUnit
{
public:
    /** \brief Give access to template parameter representing unit */
    typedef T unit_type;
    ValueAndUnit<T>& setValue( double value,T unit );
}

感谢这篇文章 Wrap C++ template class with boost python我能够包装它。这是代码,它可以正常工作。

template<typename T>
class ValueAndUnitWrap : public ValueAndUnit<T>,public wrapper<ValueAndUnit<T> > {
public:
    ValueAndUnit<T>& setValue( double value,T unit ){ return this->get_override( "setValue" )( ); }
};

template<typename T>
void export_ValueAndUnit()
{
    class_<ValueAndUnitWrap<T>,boost::noncopyable>( "ValueAndUnit",no_init )
        .def( "setValue",&ValueAndUnit<T>::setValue,return_internal_reference<>() )
        ;
}
BOOST_PYTHON_MODULE( exemple ){
    enum_<WeightUnit>( "WeightUnit" )
        .value( "WeightUnit_kg",WeightUnit::WeightUnit_kg )
        .value( " WeightUnit_pound",WeightUnit::WeightUnit_pound )
        ;

    export_ValueAndUnit <WeightUnit>();
    class_<WeightInfo,bases<ValueAndUnit<WeightUnit>> >( "WeightInfo",init<double,WeightUnit >() )
        ;
};

现在我有了这个ImmutableValueUnitAndTime类,它是从先前的模板类ValueAndUnit派生而来的(这里仅提供部分代码)。

template <class T>
class ImmutableValueUnitAndTime : public ValueAndUnit<T>
{
    typedef ValueAndUnit<T> baseClass;

public:
ImmutableValueUnitAndTime(const TimeUnit& when,double value,T unit);
}

其中使用的TimeUnit还有另一个类(代码的一部分):

class TimeUnit
{
    friend std::ostream& operator<<(std::ostream &os,const TimeUnit& var);  
public:
    TimeUnit();
static TimeUnit fromMinutes( int in_total_minutes,const TimeUnit* pReference = NULL );
}

一个派生的类是ValueUnitTimeAndDuration,它是从上一个派生的(也是部分代码):

    template <class T>
    class ValueUnitTimeAndDuration : public ImmutableValueUnitAndTime<T>
    {
        typedef ImmutableValueUnitAndTime<T> baseClass;

    public:
            /** \brief Default empty constructor */
        ValueUnitTimeAndDuration();

        ValueUnitTimeAndDuration(const ValueUnitTimeAndDuration<T>& copyFrom) = default;
}

我需要包装的最后一个是TimeBasedInfo(也是部分代码):

enum class TimeBasedUnit
{
    TimeBasedUnit_mU_min,TimeBasedUnit_U_min,TimeBasedUnit_U_hour
};


class TimeBasedInfo : public ValueUnitTimeAndDuration<TimeBasedUnit>
{
    typedef ValueUnitTimeAndDuration<TimeBasedUnit> baseClass;
public:
    /** \brief Default empty constructor */
    TimeBasedInfo();
   static TimeBasedUnit& userPreferenceUnit();
}

我没有在boost文档中找到任何信息来帮助我了解如何包装继承的模板类isTimeBasedInfo,并且我无法弄清楚如何将已经针对一个模板类所做的事情适应于此多继承类。有人知道吗?非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。