以下代码:
variant<string> x = "abc";
cout << get<string>(x) << "\n";
Run Code Online (Sandbox Code Playgroud)
在g ++(版本7.2)下正常工作.但是,当使用libstdc ++在clang ++(版本5.0)下编译时,我在get方法中得到以下错误:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../include/c++/7.2.0/variant:238:46: fatal error: cannot cast 'std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >' to its private base class 'std::__detail::__variant::_Variant_storage<false, std::
__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u);
Run Code Online (Sandbox Code Playgroud)
这是编译器错误,还是我的代码以任何方式违法?
我正在寻找一些基于模板参数编号创建具有模板参数类型的类的方法.
我想要做的是这样的事情:
template<size_t n>
constexpr auto type_from_size() {
if(n < 256) {
return uint8_t;
} else {
return uint16_t;
}
}
template<size_t n>
class X {
type_from_size<n>() t;
}
X<500> x;
x.t = 500;
Run Code Online (Sandbox Code Playgroud)
因此,在上面的代码中,constexpr函数type_from_size()将接收数字500并返回类型uint16_t,这将是成员的类型X.t.
我知道这显然是可怕的代码,但是这可能使用模板吗?
我正在编写一个类似于过滤器的应用程序:它从文件(stdin)读取输入,处理并将输出写入另一个文件(stdout).在应用程序开始写入输出文件之前,将完全读取输入文件.
因为我正在使用stdin和stdout,所以我可以运行如下:
$ ./myprog <file1.txt >file2.txt
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我尝试使用相同的文件作为输入和输出(即:从文件读取,并写入同一文件),如下所示:
$ ./myprog <file.txt >file.txt
Run Code Online (Sandbox Code Playgroud)
它会file.txt在程序有机会阅读之前进行清理.
有什么方法可以在Unix的命令行中做这样的事情吗?
假设我有一个多边形矢量,其中每个多边形包含一个点矢量.我必须在我的代码中多次迭代所有多边形的所有点,我最终不得不一遍又一遍地编写相同的代码:
for(std::vector<Polygon*>::const_iterator polygon = polygons.begin();
polygon != polygons.end(); polygon++)
{
for(std::vector<Point>::const_iterator point = (*polygon)->points.begin();
point != (*polygon)->points.end(); point++)
{
(*point).DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我真的觉得这是两个简单迭代的很多代码,感觉它堵塞了代码并干扰了可读性.
我认为有些选择:
那么,这样做最干净,最优雅的方式是什么?
我试图在表A上创建约束,以检查表B中是否存在一组记录。我可以使用外键,但是问题是表B中的数据不唯一。
有没有一种方法可以创建这样的约束而不创建触发器?
编辑:我不能更改表B的结构。
我正在使用SDL2编写一个在每一帧都显示一个tilemap的游戏,但性能太慢了.我写了一个小程序来隔离问题.考虑"temp.bmp"是16x16图像.
#include <stdio.h>
#include "SDL2/SDL.h"
#include "SDL2/SDL_timer.h"
#include "SDL2/SDL_image.h"
int main()
{
SDL_Window* win;
SDL_Renderer* ren;
int x, y;
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(800, 600, 0, &win, &ren);
SDL_Surface* sf = IMG_Load("temp.bmp");
SDL_Texture* tx = SDL_CreateTextureFromSurface(ren, sf);
for(;;) {
Uint32 t = SDL_GetTicks();
for(x=0; x<800; x+=16) {
for(y=0; y<600; y+=16) {
SDL_Rect src = { 0, 0, 16, 16 };
SDL_Rect dst = { x, y, 16, 16 };
SDL_RenderCopy(ren, tx, &src, &dst);
}
}
SDL_RenderPresent(ren);
printf("%ld ms\n", SDL_GetTicks() - t);
}
} …Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法来确定一个点是否在voronoi单元内?
例如,以下代码生成如下图所示的内容:
using namespace boost::polygon;
point_data<int> p1(0, 0);
point_data<int> p2(-10, 10);
point_data<int> p3(-10, -10);
point_data<int> p4(10, -10);
point_data<int> p5(10, 10);
std::vector<point_data<int>> pts = { p1, p2, p3, p4, p5 };
construct_voronoi(pts.begin(), pts.end(), vd);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我怎样才能知道点(5,5)是否在中心单元内?
我正在寻找一种通过“加厚”贝塞尔曲线以编程方式生成多边形的方法。像这样的东西:

我最初的想法是找到线中的法线,并从中生成多边形:

但问题是法线可以在陡峭的曲线中相互交叉,如下所示:

是否有任何公式或算法可以从贝塞尔曲线生成多边形?我在互联网上找不到任何信息,但也许我正在使用错误的词进行搜索......
我正在使用gcc来生成我的 Makefile 的依赖项。但它不使用相对路径。例如,
gcc -MM util/test.c ui/resource.c
Run Code Online (Sandbox Code Playgroud)
产生
test.o: util/test.h
resource.o: ui/resource.h
Run Code Online (Sandbox Code Playgroud)
同时,为了让make找到依赖项,它会生成如下内容:
util/test.o: util/test.h
ui/resource.o: ui/resource.h
Run Code Online (Sandbox Code Playgroud)
有没有办法让 gcc 表现得像第二个例子?
找到图形外边缘的最佳方法是什么?
例如,这张图上的红边:

不知道这个算法有没有名字。这个名字足以帮助我在谷歌上找到一些东西。
Vec与其他语言相比,在Rust中初始化速度非常慢.例如,以下代码
let xs: Vec<u32> = vec![0u32, 1000000];
Run Code Online (Sandbox Code Playgroud)
将转化为
let xs: Vec<u32> = Vec::new();
xs.push(0);
xs.push(0);
xs.push(0);
// ...
Run Code Online (Sandbox Code Playgroud)
一百万次.如果将其与C中的以下代码进行比较:
uint32_t* xs = calloc(1000000, sizeof(uint32_t));
Run Code Online (Sandbox Code Playgroud)
差异是惊人的.
我有点运气了
let xs: Vec<u32> = Vec::with_capacity(1000000);
xs.resize(1000000, 0);
Run Code Online (Sandbox Code Playgroud)
它仍然很慢.
有没有办法初始化Vec更快?
如何在 GNU automake 中转义程序名称?例如,以下工作:
lib_LTLIBRARIES = libc.la
libc_la_SOURCES = source.cc
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在程序名称上使用符号“加号”(+),如下所示:
lib_LTLIBRARIES = libc++.la
libc++_la_SOURCES = source.cc
Run Code Online (Sandbox Code Playgroud)
Make 将回应:
make[1]: *** No rule to make target 'libc++.c', needed by 'libc++.lo'. Stop.
Run Code Online (Sandbox Code Playgroud)
似乎没有找到 SOURCES 变量。我尝试在加号前面加上美元 ($)、反斜杠 (\) 和双反斜杠 (\\),但没有成功。