考虑以下类:
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)
我知道,这是不确定的行为来访问的成员Derived
在BaseCRTP<Derived>
构造函数(或析构函数),因为Derived
构造函数执行后的BaseCRTP<Derived>
构造(和析构函数的其他方式)。
我的问题是:在不访问任何成员的 …
我正在尝试将文件的修改时间格式化为字符串 (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)::clock
and 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) 我们被赋予了创建用于评估表达式的对象结构的任务(例如"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
它不正确.
除了createSumExpression
和createAndExpression
函数之外,我可以修改所有内容.
这是一段简化的代码,用于演示此问题.它有效,但看起来不太好,它会发出多个警告.
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) 我试图在 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)