小编Ric*_*ter的帖子

如何检查是否定义了固定宽度的整数

在 C++ 中,固定宽度整数被定义为optional,但我似乎无法找到推荐的方法来检查它们是否被实际定义。

检查固定宽度整数是否可用的便携式方法是什么?

c++ types cstdint stdint c++11

27
推荐指数
2
解决办法
1558
查看次数

constexpr中的字节序

我想创建一个constexpr函数来返回系统的字节序,如下所示:

constexpr bool IsBigEndian()
{
    constexpr int32_t one = 1;
    return (reinterpret_cast<const int8_t&>(one) == 0);
}
Run Code Online (Sandbox Code Playgroud)

现在,由于函数将在编译时而不是在实际的目标机器上执行,C++规范给出了什么保证以确保返回正确的结果?

c++ endianness language-lawyer constant-expression

14
推荐指数
1
解决办法
657
查看次数

计算lambda中的参数数量

我需要知道lambda具有的确切参数数量.我不关心他们的类型,我只需要一个计数.

auto lambda0 = [&]() { ... };
auto lambda1 = [&](int32_t a) { ... };
auto lambda2 = [&](int32_t a, auto b) { ... };

lambda_details<decltype(lambda0)>::argument_count; // Equals 0
lambda_details<decltype(lambda1)>::argument_count; // Equals 1
lambda_details<decltype(lambda2)>::argument_count; // Equals 2
Run Code Online (Sandbox Code Playgroud)

检测变量lambda也很好,所以我也可以处理那个边缘情况.

auto lambda_variadic = [&](auto... args){ ... };

lambda_details<decltype(lambda_variadic)>::is_variadic; // Equals true
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得这些信息?

c++ lambda template-meta-programming generic-lambda c++14

14
推荐指数
2
解决办法
461
查看次数

删除了构造函数继承

构造函数继承的一个要求是派生类不能具有任何具有相同签名的构造函数.但我不确定删除函数在这些规则下的行为方式.

class Foo
{
    public:
    Foo() = delete;
    Foo(const Foo& a_Foo) = delete;
    Foo(int a_Value) : m_Value(a_Value) {}

    private:
    int m_Value;
};

class Bar : public Foo
{
    public:
    using Foo::Foo;
    Bar() : Foo(7) {};
    Bar(const Bar& a_Bar) : Foo(12) {};
};
Run Code Online (Sandbox Code Playgroud)
  • 被删除的构造函数是否继承?
  • 如果是这样,Bar()并且Foo()具有相同的签名,这是否会使代码无效?
  • 你可以争辩Foo(const Foo& a_Foo)并且Bar(const Bar& a_Bar) 有不同的签名.复制构造函数如何在构造函数继承下运行?

c++ inheritance constructor c++11

8
推荐指数
1
解决办法
3905
查看次数

如何显示自定义类的文本可视化工具

我有生成字符串的构建器类。输出字符串可通过该ToString()方法获得。我想在 Visual Studio 的调试器中显示此输出。

当我查看原始字符串时,我得到以下结果:

细绳

然而,当我查看构建器时,它缺少换行符以及“查看”按钮:

方法脚本生成器

添加[DebuggerDisplay("{ToString()}")]到至少会显示换行符,但仍然没有“查看”按钮。

方法脚本生成器

如何使我的类自动显示与字符串完全相同的内容,包括“查看”按钮?

c# visual-studio visual-studio-debugging

8
推荐指数
1
解决办法
348
查看次数

如何使用通用数学生成常量值

我有以下通用数学函数:

private static T Fade<T>(T t)
    where T : IFloatingPoint<T>
{
    return t * t * t * (t * (t * 6 - 15) + 10);
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译,因为61510不是 类型T

我能想到的最好的解决方案是定义一个静态类,如下所示:

private static class GenericValues<T>
    where T : IFloatingPoint<T>
{
    public static readonly T Two = T.One + T.One;
    public static readonly T Three = Two + T.One;
    public static readonly T Four = Three + T.One;
    public static readonly T Five …
Run Code Online (Sandbox Code Playgroud)

c# generics .net-7.0 .net-generic-math

8
推荐指数
1
解决办法
238
查看次数

使用System.Text.Json异步反序列化列表

可以说,我请求一个包含许多对象列表的大型json文件。我不希望它们一次全部出现在内存中,但我宁愿一个个地读取和处理它们。所以我需要将异步System.IO.Stream流转换为IAsyncEnumerable<T>。我如何使用新的System.Text.JsonAPI来做到这一点?

private async IAsyncEnumerable<T> GetList<T>(Uri url, CancellationToken cancellationToken = default)
{
    using (var httpResponse = await httpClient.GetAsync(url, cancellationToken))
    {
        using (var stream = await httpResponse.Content.ReadAsStreamAsync())
        {
            // Probably do something with JsonSerializer.DeserializeAsync here without serializing the entire thing in one go
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# .net-core c#-8.0 .net-core-3.0 system.text.json

7
推荐指数
2
解决办法
266
查看次数

函数定义的全局命名空间作用域

我正在围绕C++库创建一个C包装器.这样做的一个常见错误是函数声明和定义由于某种原因而不匹配(拼写错误,重命名,添加/删除参数等).

例如:

// enabledata.h
MDS_C_API const char* motek_mds_enable_data_get_enable_command_name();

// enabledata.cpp
const char* motek_mds_enable_data_enable_command_name() { ... }
Run Code Online (Sandbox Code Playgroud)

名称不匹配,但由于缺少这些函数的作用域,它不会导致任何编译错误,并且只会在稍后的行中显示为链接错误.

我希望编译器通过使用全局范围运算符来帮助我找到这些错误,如下所示:

const char* ::motek_mds_enable_data_get_disable_command_name() { ... }
Run Code Online (Sandbox Code Playgroud)

如果函数尚未声明,现在将显示为编译错误,这正是我想要的.

但是,当函数返回typedef时,这不起作用:

int32_t ::motek_mds_enable_data_is_enabled(const Data* a_Data) { ... }
Run Code Online (Sandbox Code Playgroud)

这将导致尝试int32_t用作范围,这当然会导致错误:

left of '::' must be a class/struct/union
Run Code Online (Sandbox Code Playgroud)

有没有办法让这项工作?当然也欢迎更好的替代品.

我目前正在使用Visual Studio 2015 Update 2.

c++ visual-studio visual-studio-2015

6
推荐指数
1
解决办法
119
查看次数

SRW锁定在共享内存中

可以SRW锁被放置在共享内存时进程之间使用?

它们的内存占用似乎只是一个单指针,但是我无法找到有关锁定时后台实际发生情况的文档.

如果可能的话,我想避免内核互斥,但它开始看起来像我正在进入未定义的行为领域.

c++ winapi

6
推荐指数
1
解决办法
444
查看次数

无符号转换为已签名并返回

我有一个无符号值,需要将函数作为有符号值传递(函数不会触及它).当它出现时我把它丢回原状.我知道转换为强制转换时执行定义的转换结果,但是我可以至少保证当我将其转换回来时(例如使用函数指针)我会得到相同的值吗?

例:

int32_t function_with_default(int32_t a_Default)
{
    // Try some stuff
    // ...

    // Fall back to default
    return a_Default;
}

void main()
{
    uint32_t input = UINT32_MAX;
    uint32_t output = static_cast<uint32_t>(function_with_default(static_cast<int32_t>(input));

    // Is is guarenteed to be true?
    input == output;
}
Run Code Online (Sandbox Code Playgroud)

我确实保证有符号整数总是大于或等于无符号整数(以字节为单位),因此不会因缺少空间而丢失数据.

c++ language-lawyer

6
推荐指数
1
解决办法
1538
查看次数