gpt4 book ai didi

c++ - 解决多重重载

转载 作者:行者123 更新时间:2023-11-30 03:18:16 26 4
gpt4 key购买 nike

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

#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 类型有效.我该如何重构才能使这段代码正常工作?如果我可以有一个函数(使用模板或其他)来安全地跨所有三种类型或可能更多类型执行操作,那将是理想的。

最佳答案

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

#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

关于c++ - 解决多重重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com