我有一个类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)
这是我想要做的:
如果东西是const,请在Stuff的析构函数中调用const foo.
如果东西不是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,它什么都不做.
可以使用运算符在一行中附加/多个路径:
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)
我错过了什么吗?这种不一致有原因吗?
我有一个简单的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的混合来获得最终结果。
我有一个包含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)
我的代码有两件事我不喜欢:
我尝试使用lateinit var,但编译器不允许我在原始类型上执行此操作。Kotlin 有没有办法克服上面提到的两个问题?
为什么std::range::sort(和其他基于范围的算法)在range命名空间中实现?为什么不将其定义为std::sort范围超载?
如果我有一个像这样的简单张量类
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) 我正在使用带有 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 中执行此操作的正确方法是什么?
我一直在寻找一种同时使用模板和多态的方法.这是我的问题的简化版本:
#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) 我想使用 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++ ×9
c++20 ×3
android ×1
android-room ×1
benchmarking ×1
c++-concepts ×1
c++-modules ×1
cmake ×1
const ×1
destructor ×1
function ×1
kotlin ×1
mpi ×1
polymorphism ×1
sorting ×1
std-ranges ×1
templates ×1
virtual ×1