小编Tou*_*dou的帖子

找出析构函数中对象的常量

我有一个类Stuff,有两个函数foo(const和non-const):

class Stuff
{
public:
    ~Stuff() { foo(); }

    void foo() const { cout << "const foo" << endl; }
    void foo()       { cout << "non-const foo" << endl; }
};
Run Code Online (Sandbox Code Playgroud)

这是我想要做的:

  1. 如果东西是const,请在Stuff的析构函数中调用const foo.

  2. 如果东西不是const,则在Stuff的析构函数中调用非const foo.

我希望只是定义如上所示的析构函数是可行的,但事实证明,在执行析构函数之前,constness被删除了(它在构造函数完成后立即强制执行,所以我也不能在那里设置任何标志).为了更清楚,这是一个例子:

{ Stuff stuff; }
{ const Stuff cstuff; }
Run Code Online (Sandbox Code Playgroud)

此代码两次打印"non-const foo".我希望它打印"non-const foo",然后是"const foo".这可能与C++有关吗?

编辑:有些人要求更多背景.在实际代码中,东西基本上是一些数据的句柄.如果以非const方式访问stuff,我假设数据已被修改,所以我需要使用foo函数将其传递给其他进程(MPI)(在我修改它之后 - >在析构函数中,当我释放手柄).如果以const方式访问它,我知道我不需要传输任何东西,所以我调用非const foo,它什么都不做.

c++ destructor const

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

std::filesystem::path 没有运算符+?

可以使用运算符在一行中附加/多个路径:

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C";
Run Code Online (Sandbox Code Playgroud)

这是相当方便的。然而,concat只提供+=

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C" + ".d";   // NOT OK
Run Code Online (Sandbox Code Playgroud)

这非常烦人,因为我无法轻松地将扩展添加到路径的末尾。我别无选择,只能写一些类似的东西

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C";
  p2 += ".d";
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?这种不一致有原因吗?

c++ std-filesystem

12
推荐指数
1
解决办法
1984
查看次数

这是对 C++20 概念的正确使用吗?

我有一个简单的Vec3<T>类,我想使用 C++20 概念(带有 -std=c++20 的 Clang 10.0.0)更新它。新版本看起来像这样:

template <typename T> concept Arithmetic = std::is_arithmetic_v<T>;
template <typename T> concept FloatingPoint = std::is_floating_point_v<T>;

template <Arithmetic T> struct Vec3 {
  T x, y, z;

  /* operator overloading, etc.. */
  
  void normalize() requires FloatingPoint<T>;
};
Run Code Online (Sandbox Code Playgroud)

这是对 C++20 概念的正确使用吗?该核心准则T11推荐使用标准的概念,尽可能的,但我找不到我在想的那些C ++的命名要求列表,也没有在<concepts>头文件。这是因为我的概念太具体了,一开始就不应该是概念吗?

我的原始代码使用static_assert和 SFINAE的混合来获得最终结果。

c++ c++-concepts c++20

9
推荐指数
1
解决办法
389
查看次数

共享库和 c++20 模块

关于如何在共享库中正确使用 C++20 模块的在线文档非常少。许多人显然 感兴趣,但我一直无法找到明确的解决方案。

在MSVC中,您需要dllexport在编译库和dllimport使用符号时使用。这可以使用“旧版 C++”中的宏来完成,但这不适用于 C++20 模块,因为无论预处理器指令如何,代码仅编译一次。

这篇文章建议您现在只需要使用dllexportdllimport编译器会自动处理。然而,这来自一条现已被删除的评论,而且我找不到有关该主题的任何可靠来源。

如何使用 C++20 模块创建共享库?

c++ shared-libraries c++20 c++-modules

9
推荐指数
1
解决办法
4346
查看次数

Android Room 自动生成和初始化

我有一个包含Stuff实体的 Room 数据库。这些实体具有将自动生成的 ID:

@Entity(tableName = "stuff")
data class Stuff(val text: String) {
    @PrimaryKey(autoGenerate = true) var id: Int = 0
}
Run Code Online (Sandbox Code Playgroud)

我的代码有两件事我不喜欢:

  1. 我用 0 初始化 id,即使它应该由 Room 初始化。
  2. id 数据成员是可变的。

我尝试使用lateinit var,但编译器不允许我在原始类型上执行此操作。Kotlin 有没有办法克服上面提到的两个问题?

android auto-generate kotlin android-room

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

为什么 C++20 范围库有自己的命名空间?

为什么std::range::sort(和其他基于范围的算法)在range命名空间中实现?为什么不将其定义为std::sort范围超载?

c++ c++20 std-ranges

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

通过指针算法访问结构数据成员

如果我有一个像这样的简单张量类

struct Tensor
{
    double XX, XY, XZ;
    double YX, YY, YZ;
    double ZX, ZY, ZZ;
}
Run Code Online (Sandbox Code Playgroud)

使用指针算术(参见下文)访问其元素是否是未定义的行为?

 double& Tensor::operator[](int i) 
{ 
    assert(i < 9); 
    return (&XX)[i]; 
}
Run Code Online (Sandbox Code Playgroud)

c++ pointer-arithmetic undefined-behavior

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

使用 VS Code 和 CMake 工具运行自定义命令

我正在使用带有 CMake Tools 扩展的 VS Code,我想运行一个简单的 MPI 程序。一切都编译得很好,我可以在终端中运行我的代码

mpiexec -n 6 "path-to-my-workspace\build\my-executable.exe"
Run Code Online (Sandbox Code Playgroud)

但是,我想进行设置,以便在我按 Control + Shift + P >“CMake:Run without Debugging”(或 Shift F5)时自动执行。

我在CMake 工具文档中读到我可以在 launch.json 文件中创建新的启动目标。但是,VS Code 文档指出

launch.json 文件用于在 Visual Studio Code 中配置调试器。

我想要这个用于调试,但也用于发布。我还应该使用 launch.json 文件吗?过去,当我需要将参数传递给主函数时,我遇到了同样的问题。使用 CMake 工具在 VS Code 中执行此操作的正确方法是什么?

c++ cmake mpi visual-studio-code

7
推荐指数
1
解决办法
1005
查看次数

c ++中的虚拟模板函数

我一直在寻找一种同时使用模板和多态的方法.这是我的问题的简化版本:

#include <iostream>
#include <vector>
using std::cout;
using std::endl;

//*******************************************************************
//*******************************************************************

struct DerivedStuff1
{
    static void eval() { cout << "evaluating DerivedStuff1" << endl; }
};

struct DerivedStuff2
{
    static void eval() { cout << "evaluating DerivedStuff2" << endl; }
};

//*******************************************************************
//*******************************************************************
class BaseClass
{
public:
    template<typename StuffType> virtual void eval() const = 0;
};

class DerivedClass1 : public BaseClass
{
public:
    template<typename StuffType> virtual void eval() const
    {
        std::cout << "We are in DerivedClass1: ";
        StuffType::eval();
    }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism virtual templates function

5
推荐指数
2
解决办法
2102
查看次数

Google Benchmark 排序算法

我想使用 Google Benchmark 对各种排序算法进行基准测试。如果我使用

static void StdSort(benchmark::State& state) {
  auto v = generate_random_vector(state.range(0));
  for (auto _ : state)
    std::sort(std::begin(v), std::end(v));
}
BENCHMARK(StdSort)->Arg(10)->Arg(1000)->Arg(1'000'000);
Run Code Online (Sandbox Code Playgroud)

大多数时候我最终都会对预先排序的向量进行排序。我在手册中读到,我可以使用手动计时来仅对我关心的部分进行基准测试:

static void StdSort(benchmark::State& state) {
  auto v = generate_random_vector(state.range(0));
  std::default_random_engine gen;
  for (auto _ : state) {
    auto start = std::chrono::high_resolution_clock::now();
    std::sort(std::begin(v), std::end(v));
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed_seconds =
        std::chrono::duration_cast<std::chrono::duration<double>>(end - start);

    state.SetIterationTime(elapsed_seconds.count());
    std::shuffle(std::begin(v), std::end(v), gen);
  }
}
BENCHMARK(StdSort)->Arg(10)->Arg(1000)->Arg(1'000'000)->UseManualTime();
Run Code Online (Sandbox Code Playgroud)

这是使用 Google Benchmark 对排序算法进行基准测试的正确方法吗?有更好的方法吗?

c++ sorting benchmarking google-benchmark

5
推荐指数
0
解决办法
490
查看次数