模板函数仅适用于枚举类型

问题描述

我正在使用QtDbus,我需要创建一个通用函数来封送/解组仅枚举类型,如下面的示例所述。

Source

#include <QtDBus/QDBusArgument>

#include <boost/type_traits/is_enum.hpp>

using namespace std;

template<typename T,typename TEnum>
class QDBusEnumMarshal;

template<typename T>
class QDBusEnumMarshal<T,boost::true_type>
{
public:
    static QDBusArgument& marshal(QDBusArgument &argument,const T& source)
    {
        argument.beginStructure();
        argument << static_cast<int>(source);
        argument.endStructure();
        return argument;
    }

    static const QDBusArgument& unmarshal(const QDBusArgument &argument,T &source)
    {
        int a;
        argument.beginStructure();
        argument >> a;
        argument.endStructure();
    
        source = static_cast<T>(a);
    
        return argument;
    }
};

template<typename T>
QDBusArgument& operator<<(QDBusArgument &argument,const T& source)
{
    return QDBusEnumMarshal<T,typename boost::is_enum<T>::type>::marshal(argument,source);
}

template<typename T>
const QDBusArgument& operator>>(const QDBusArgument &argument,T &source)
{
    return QDBusEnumMarshal<T,typename boost::is_enum<T>::type>::unmarshal(argument,source);
}

但是这个示例使用boost库来实现它,我想使用STL来实现。我尝试将其转换为以下内容,但是我不确定它是否完全等同于启动。任何人都可以查找并确认这是正确的方法还是存在其他更好的解决方案?

template<typename T,bool isEnum>
class QDBusEnumMarshal;

template<typename T>
class QDBusEnumMarshal<T,true>
{
public:
    using enum_t = typename std::underlying_type<T>::type;

    static QDBusArgument& marshal(QDBusArgument& arg,const T& src)
    {
        arg.beginStructure();
        arg << static_cast<enum_t>(src);
        arg.endStructure();

        return arg;
    }

    static const QDBusArgument& unmarshal(const QDBusArgument& arg,T& src)
    {
        enum_t tmp;

        arg.beginStructure();
        arg >> tmp;
        arg.endStructure();

        src = static_cast<T>(tmp);
        return arg;
    }
};

template<typename T>
QDBusArgument& operator<<(QDBusArgument& arg,const T& src)
{
    return QDBusEnumMarshal<T,std::is_enum<T>::value>::marshal(arg,src);
}

template<typename T>
const QDBusArgument& operator>>(const QDBusArgument& arg,T& src)
{
    return QDBusEnumMarshal<T,std::is_enum<T>::value>::unmarshal(arg,src);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)