小编And*_*ner的帖子

get <string>表示变体在clang ++下失败但不是g ++

以下代码:

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)

这是编译器错误,还是我的代码以任何方式违法?

c++ variant clang++ c++17

25
推荐指数
1
解决办法
1806
查看次数

如何创建一个返回类型的constexpr函数(在模板参数中使用)

我正在寻找一些基于模板参数编号创建具有模板参数类型的类的方法.

我想要做的是这样的事情:

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.

我知道这显然是可怕的代码,但是这可能使用模板吗?

c++

14
推荐指数
4
解决办法
1419
查看次数

使用stdin和stdout的相同文件进行重定向

我正在编写一个类似于过滤器的应用程序:它从文件(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的命令行中做这样的事情吗?

unix pipe

13
推荐指数
3
解决办法
3855
查看次数

在C++中迭代的优雅方式

假设我有一个多边形矢量,其中每个多边形包含一个点矢量.我必须在我的代码中多次迭代所有多边形的所有点,我最终不得不一遍又一遍地编写相同的代码:

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)

我真的觉得这是两个简单迭代的很多代码,感觉它堵塞了代码并干扰了可读性.

我认为有些选择:

  • 使用#defines - 但它会使得不可移植(在代码的其他部分使用).此外,#define现在被认为是邪恶的;
  • 迭代vector-> size() - 它似乎不是最优雅的方式;
  • 使用函数指针调用方法 - 但在这种情况下,应该在循环内部的代码远离循环.

那么,这样做最干净,最优雅的方式是什么?

c++ coding-style vector

7
推荐指数
4
解决办法
968
查看次数

非唯一索引上的外键?(甲骨文)

我试图在表A上创建约束,以检查表B中是否存在一组记录。我可以使用外键,但是问题是表B中的数据不唯一。

有没有一种方法可以创建这样的约束而不创建触发器?

编辑:我不能更改表B的结构。

sql oracle database-design constraints data-modeling

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

SDL2 tilemap - 太慢了

我正在使用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)

c sdl sdl-2

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

找出一个点是否在voronoi单元格内

有没有一种简单的方法来确定一个点是否在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)

voronoi图

在这种情况下,我怎样才能知道点(5,5)是否在中心单元内?

我可以从每个单元格中创建一个多边形并找出使用多边形算法中,但我很有兴趣知道库提供"免费"的东西.

c++ boost voronoi boost-polygon

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

如何生成“粗”贝塞尔曲线?

我正在寻找一种通过“加厚”贝塞尔曲线以编程方式生成多边形的方法。像这样的东西:

粗贝塞尔曲线

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

贝塞尔法线

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

贝塞尔法线相互交叉

是否有任何公式或算法可以从贝塞尔曲线生成多边形?我在互联网上找不到任何信息,但也许我正在使用错误的词进行搜索......

geometry bezier

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

使 gcc -MM 输出目标文件名的相对路径

我正在使用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 表现得像第二个例子?

gcc makefile

4
推荐指数
1
解决办法
3922
查看次数

查找图的外边缘

找到图形外边缘的最佳方法是什么?

例如,这张图上的红边:

图形

不知道这个算法有没有名字。这个名字足以帮助我在谷歌上找到一些东西。

computer-science graph-theory

2
推荐指数
1
解决办法
1732
查看次数

如何改善Vec初始化时间?

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更快?

rust

2
推荐指数
1
解决办法
434
查看次数

在 automake 中转义程序名称

如何在 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 变量。我尝试在加号前面加上美元 ($)、反斜杠 (\) 和双反斜杠 (\\),但没有成功。

automake

0
推荐指数
1
解决办法
336
查看次数