gpt4 book ai didi

c++ - C++ 中是否有所有不同整数类型的完整且可移植的列表?

转载 作者:行者123 更新时间:2023-11-30 01:10:15 24 4
gpt4 key购买 nike

我想实现一个处理所有简单 C++ 类型(还有 STL 容器和更多类型,但它们不会让我头疼)的函数,以及一个处理所有其他类型的通用函数,如下所示:

template <typename T>
void dostuff(T& arg)
{ cout << "generic version" << endl; }
void dostuff(int& arg)
{ cout << "something useful" << endl; }
void dostuff(unsigned int& arg)
{ cout << "something slightly different" << endl; }
void dostuff(short& arg)
{ cout << "something slightly different again" << endl; }
// ...and so on for all integer types...

这里我限制自己使用整数类型,因为它们会造成所有的麻烦。当然,如果我为同一类型实现函数两次,编译器会报错。当混合 unsigned intstd::size_t 时会发生这种情况;它适用于我的系统,但不能在 32 位平台上编译。我明白这个问题,但我不知道如何实现可移植的解决方案。

我认为最系统的方法是使用 std::int8_t (std::uint8_t, 16, 32, 64) 系列类型,因为它们不会重叠并且旨在覆盖可用范围。事实证明这还不够,如以下代码所示:

#include <type_traits>
#include <cstdint>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
cout << "SIZE:" << endl;
cout << "sizeof(unsigned long) = " << sizeof(unsigned long) << endl;
cout << "sizeof(unsigned long long) = " << sizeof(unsigned long long) << endl;
cout << "sizeof(std::size_t) = " << sizeof(std::size_t) << endl;
cout << "sizeof(std::uint64_t) = " << sizeof(std::uint64_t) << endl;
cout << endl;

cout << "SIGNED?" << std::boolalpha << endl;
cout << std::is_signed<unsigned long>::value << endl;
cout << std::is_signed<unsigned long long>::value << endl;
cout << std::is_signed<std::size_t>::value << endl;
cout << std::is_signed<std::uint64_t>::value << endl;
cout << endl;

cout << "SAME?" << endl;
cout << std::is_same<unsigned long, unsigned long long>::value << endl;
cout << std::is_same<unsigned long, std::size_t>::value << endl;
cout << std::is_same<unsigned long, std::uint64_t>::value << endl;
cout << std::is_same<unsigned long long, std::size_t>::value << endl;
cout << std::is_same<unsigned long long, std::uint64_t>::value << endl;
cout << std::is_same<std::size_t, std::uint64_t>::value << endl;
}

在我的带有 clang 3.8 的 64 位 MacOS 系统上,它给出了以下输出:

SIZE:
sizeof(unsigned long) = 8
sizeof(unsigned long long) = 8
sizeof(std::size_t) = 8
sizeof(std::uint64_t) = 8

SIGNED?
false
false
false
false

SAME?
false
true
false
false
true
false

所以我有四种 64 位无符号整数类型,但它们实际上指的只是两种不同类型。还有更多候选者,例如 std::uintptr_tstd::ptrdiff_tstd::uint_fast64_t,我什至不知道如果该列表是完整的。哪些类型相同的定义在我看来是随意的,尽管我看到对于我面临的确切问题,我们希望将 longlong long 视为不同的。

问题:有什么方法可以针对不同整数类型的详尽列表实现上述功能,这样我就不会在不同平台上遇到麻烦吗?如果是这样,这个列表是什么?如果不是,实现所需行为的最佳方法是什么(处理所有整数类型、未知类型的有意义的默认行为、可移植解决方案)?

最佳答案

由于您要尝试为每个特定的整数类型做一些不同的事情,即使您可以枚举程序中的所有类型,您也无法组成特定的特殊逻辑。

相反,我要建议的是实现 say short 的特殊逻辑。 , int , unsigned , 等等,并根据需要放置一个静态断言 is_integral<T>false在您的主模板中,带有一条消息,表明正在使用不受支持的整数类型调用它,需要确定和编写自定义逻辑。

关于c++ - C++ 中是否有所有不同整数类型的完整且可移植的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38398796/

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