如何解决模板函数仅适用于枚举类型
我正在使用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 举报,一经查实,本站将立刻删除。