小编ttt*_*apa的帖子

在 CRTP 基类构造函数中向下转换为派生类:UB 与否?

考虑以下类:

template <class Derived>
class BaseCRTP {
  private:
    friend class LinkedList<Derived>;
    Derived *next = nullptr;

  public:
    static LinkedList<Derived> instances;

    BaseCRTP() {
        instances.insert(static_cast<Derived *>(this));
    }
    virtual ~BaseCRTP() {
        instances.remove(static_cast<Derived *>(this));
    }
};
Run Code Online (Sandbox Code Playgroud)
struct Derived : BaseCRTP<Derived> {
    int i;
    Derived(int i) : i(i) {}
};
Run Code Online (Sandbox Code Playgroud)
int main() {
    Derived d[] = {1, 2, 3, 4};
    for (const Derived &el : Derived::instances) 
        std::cout << el.i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我知道,这是不确定的行为来访问的成员DerivedBaseCRTP<Derived>构造函数(或析构函数),因为Derived构造函数执行BaseCRTP<Derived>构造(和析构函数的其他方式)。

我的问题是:在不访问任何成员的 …

c++ crtp downcast undefined-behavior language-lawyer

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

如何使用 GCC 9 将 `std::filesystem::file_time_type` 转换为字符串

我正在尝试将文件的修改时间格式化为字符串 (UTC)。以下代码使用 GCC 8 编译,但不使用 GCC 9。

#include <chrono>
#include <filesystem>
#include <iomanip>
#include <iostream>
#include <sstream>

namespace fs = std::filesystem;

int main() {
    fs::file_time_type file_time = fs::last_write_time(__FILE__);
    std::time_t tt = decltype(file_time)::clock::to_time_t(file_time);
    std::tm *gmt = std::gmtime(&tt);
    std::stringstream buffer;
    buffer << std::put_time(gmt, "%A, %d %B %Y %H:%M");
    std::string formattedFileTime = buffer.str();
    std::cout << formattedFileTime << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我使用 C++17 和 C++20 都尝试过decltype(file_time)::clockand std::chrono::file_clock,但它们都不起作用。

$ g++-9 -std=c++2a -Wall -Wextra -lstdc++fs file_time_type.cpp

file_time_type.cpp: In function ‘int main()’:
file_time_type.cpp:12:50: error: ‘to_time_t’ …
Run Code Online (Sandbox Code Playgroud)

c++ std-filesystem gcc9

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

在运行时转换之前检查泛型类型

我们被赋予了创建用于评估表达式的对象结构的任务(例如"1 + 2"或"true&false").提供了解析器,以及用于创建表达式对象的工厂接口.

我们对不同的表达式使用泛型:Expression<Integer>返回一个Integer,Expression<Boolean>返回一个布尔值等.

我们面临的问题是提供的接口使用原始类型Expression,例如:

public Expression createSumExpression(Expression left, Expression right);
Run Code Online (Sandbox Code Playgroud)

sum表达式仅在操作数类型为Expression<Integer>或时定义Expression<Double>.我们怎么检查这个?由于类型擦除,类型信息在运行时不可用,它只会导致ClassCastException它不正确.

除了createSumExpressioncreateAndExpression函数之外,我可以修改所有内容.


这是一段简化的代码,用于演示此问题.它有效,但看起来不太好,它会发出多个警告.

Main.java

public class Main {

    public static void main(String[] args) {
        Expression<?> left1 = new BasicExpression<>(42);
        Expression<?> right1 = new BasicExpression<>(3);        
        Expression<?> sum = createSumExpression(left1, right1);
        System.out.printf("%d + %d = %d%n",left1.getValue(), right1.getValue(), sum.getValue());

        Expression<?> left2 = new BasicExpression<>(true);
        Expression<?> right2 = new BasicExpression<>(false);
        Expression<?> and = createAndExpression(left2, right2);
        System.out.printf("%b & …
Run Code Online (Sandbox Code Playgroud)

java generics casting

5
推荐指数
1
解决办法
455
查看次数

Matplotlib:在 3D 表面上绘制 3D 曲线

我试图在 Matplotlib 中的 3D 曲面顶部绘制 3D 曲线,但是当曲线位于曲面前面时,它几乎不可见(曲线是单位圆的图像): 在此处输入图片说明 应该有一条绿色曲线漂浮在表面上方一个单位。
如果从侧面看,可以看到曲线中不在曲面前面的部分(曲面中央峰左侧和右侧的小环): 在此处输入图片说明

有没有办法让这个工作?我试过白色表面,有和没有抗锯齿,但无济于事。

这是我正在使用的代码:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

N = 5

# Make H surface
X = np.linspace(-1.25, 1.25, 1024)
Y = np.linspace(-1.25, 1.25, 1024)
X, Y = np.meshgrid(X, Y)
Z = 1/N * np.abs(1 - (X + Y*1j)**-N) / np.abs(1 - 1/(X + Y*1j))
Z = 20 * np.log10(Z)

# Make the image of …
Run Code Online (Sandbox Code Playgroud)

python matplotlib surface

5
推荐指数
1
解决办法
997
查看次数