解决多个重载

时间:2019-02-25 05:14:09

标签: c++

我有一个连接位的函数的三个重载:

#include <cstdint>

static uint16_t ConcatenateBits(uint8_t const highPart, uint8_t const lowPart) {
    return ((((uint16_t)highPart) << (sizeof(uint8_t) * 8)) | lowPart);
}
static uint32_t ConcatenateBits(uint16_t const highPart, uint16_t const lowPart) {
    return ((((uint32_t)highPart) << (sizeof(uint16_t) * 8)) | lowPart);
}
static uint64_t ConcatenateBits(uint32_t const highPart, uint32_t const lowPart) {
    return ((((uint64_t)highPart) << (sizeof(uint32_t) * 8)) | lowPart);
}

int main() {
    return ConcatenateBits(7, 3);
}

我遇到的问题是,由于所有三个重载均对类型main有效,因此编译器无法解析int中的代码。我如何重构事物以便此代码起作用?如果我可以使用一个函数(使用模板或其他工具)来安全地执行所有三种类型的操作,或者可能执行更多操作,那将是理想的选择。

2 个答案:

答案 0 :(得分:1)

  

我如何重构事物以便此代码起作用?

我可以想到以下选项:

  1. 显式删除其中一个参数。

    return ConcatenateBits(static_cast<uint8_t>(7), 3);
    
  2. 使用变量代替文字。

    uint8_t v1 = 7;
    return ConcatenateBits(v1, 3);
    

答案 1 :(得分:1)

如果您使用的是C ++ 17,则可以执行以下操作(在Debian上使用g++ -std=c++17 -Wall -Wpedantic main.cc版本7.3.0的命令g++编译):

#include <iostream>
#include <cstdint>
#include <climits>
#include <type_traits>

template<typename InputType>
constexpr auto ConcatenateBits(InputType highPart, InputType lowPart) {
  constexpr bool is_uint8 = std::is_same<InputType, uint8_t>::value;
  constexpr bool is_uint16 = std::is_same<InputType, uint16_t>::value;
  constexpr bool is_uint32 = std::is_same<InputType, uint32_t>::value;
  static_assert(is_uint8 || is_uint16 || is_uint32,
                "Input type to ConcatenateBits must be uint{8,16,32}_t.");
  if constexpr (is_uint8) {
    uint16_t output = lowPart;
    output |= (static_cast<uint16_t>(highPart) << (sizeof(InputType) * CHAR_BIT));
    return output;
  } else if constexpr (is_uint16) {
    uint32_t output = lowPart;
    output |= (static_cast<uint32_t>(highPart) << (sizeof(InputType) * CHAR_BIT));
    return output;
  } else {
    uint64_t output = lowPart;
    output |= (static_cast<uint64_t>(highPart) << (sizeof(InputType) * CHAR_BIT));
    return output;
  }
}

int main() {
  uint16_t explicitly_typed_variable = 1;
  std::cout << ConcatenateBits(explicitly_typed_variable, explicitly_typed_variable) << "\n";
  std::cout << ConcatenateBits<uint8_t>(1, 2) << "\n";
}

输出:

65537
258