我有一个连接位的函数的三个重载:
#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
中的代码。我如何重构事物以便此代码起作用?如果我可以使用一个函数(使用模板或其他工具)来安全地执行所有三种类型的操作,或者可能执行更多操作,那将是理想的选择。
答案 0 :(得分:1)
我如何重构事物以便此代码起作用?
我可以想到以下选项:
显式删除其中一个参数。
return ConcatenateBits(static_cast<uint8_t>(7), 3);
使用变量代替文字。
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