c++ - 如何通过函数模板参数化函数?

标签 c++ templates

在实现一个结构体的字节序转换函数时,发现这个实现违反了DRY原则。
下面是代码片段来说明我的意思:

inline void FromHostByteorderToNetwork(ServerStatus& ss) {
  ss.field0 = qToBigEndian<__int32>(ss.field0);
  ss.field1 = qToBigEndian<__int16>(ss.field1);
//... 20+ more fields assigned in the same way

inline void FromNetworkByteorderToHost(ServerStatus& ss) {
  ss.field0 = qFromBigEndian<__int32>(ss.field0);
  ss.field1 = qFromBigEndian<__int16>(ss.field1);
//... 20+ more fields assigned in the same way

我想要的:一个例程,我可以在其中传递模板函数的名称 (qToBigEndian/qFromBigEndian),其实现如下:

template <typename ByteConversionFunctionT>
inline void changeByteOrder(ServerStatus& ss) {
      ss.field0 = ByteConversionFunctionT<__int32>(ss.field0);
      ss.field1 = ByteConversionFunctionT<__int16>(ss.field1);

重要信息:
另外,请注意 changeByteOrder 中的 ByteConversionFunctionT 是用不同的类型实例化的:比如 __int32/__int16

在 Qt 头文件中,qFrom/To 是一个模板:

template <typename T> inline T qFromBigEndian(T source)

您能否建议执行此操作的方法,或者是否可以遵守 KISS 和重复代码以避免额外的复杂性?

最佳答案

一种选择是编写一个类模板包装器:

template <class T>
struct FromBigEndian
{
  static T call(T source) { return qFromBigEndian(source); }
};

template <class T>
struct ToBigEndian
{
  static T call(T source) { return qToBigEndian(source); }
};

template <template <class> class ByteConvertor>
void changeByteOrder(ServerStatus &ss)
{
  ss.field0 = ByteConvertor<__int32>::call(ss.field0);
  ss.field1 = ByteConvertor<__int16>::call(ss1.field1);
}

关于c++ - 如何通过函数模板参数化函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33391970/

相关文章:

C++:将 const 与 STL 迭代器一起使用

c++ - 关于 C++17 中尾随返回类型的问题

c++ - 具有范围限定符的模板语法的含义

c++ - Negamax C++实现产生错误结果

php - 在 smarty 中处理递归的最佳方法是什么?

C# 从 CPP 调用未知数量的参数的 CPP 函数

c++ - "First defined here"错误

c++ - 模板参数推导和 SFINAE - 使用 std::enable_if

c++ - 有 gtest 比较二进制的东西吗?

c++ - 在 SFINAE 上下文中使用的表达式中使用的 static_assert