小编nwp*_*nwp的帖子

迭代不同的类型

给出以下代码:

struct Window{
    void show();
    //stuff
}w1, w2, w3;

struct Widget{
    void show();
    //stuff
}w4, w5, w6;

struct Toolbar{
    void show();
    //stuff
}t1, t2, t3;
Run Code Online (Sandbox Code Playgroud)

我想要show一堆物品:

for (auto &obj : {w3, w4, w5, t1})
    obj.show();
Run Code Online (Sandbox Code Playgroud)

然而,这不会编译,因为std::initializer_list<T>for-loop中无法推断T,事实上并没有真正T适合的.我不想创建类型擦除类型,因为需要大量的代码和不必要的运行时开销.如何正确编写循环以便obj分别为概念列表中的每个项推导出类型?

c++ c++11 c++14

62
推荐指数
6
解决办法
5886
查看次数

Valgrind无法识别的指令

我有以下代码:

#include <iostream>
#include <random>

int main() {
    std::mt19937_64 rng(std::random_device{}());
    std::cout << std::uniform_int_distribution<>(0, 100)(rng) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用valgrind它来描述它,但它说:

vex amd64->IR: unhandled instruction bytes: 0xF 0xC7 0xF0 0x89 0x6 0xF 0x42 0xC1
vex amd64->IR:   REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR:   VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=0F
vex amd64->IR:   PFX.66=0 PFX.F2=0 PFX.F3=0
==2092== valgrind: Unrecognised instruction at address 0x4cdc1b5.  
==2092== at 0x4CDC1B5:std::(anonymous namespace)::__x86_rdrand() (random.cc:69)  
==2092== by 0x4CDC321: std::random_device::_M_getval() (random.cc:130)  
==2092== by 0x4009D4: main (random.h:1619)  
Run Code Online (Sandbox Code Playgroud)

在多个实例之前:

--2092-- WARNING: Serious error when reading …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind libstdc++ gcc5

27
推荐指数
1
解决办法
7736
查看次数

将互斥锁绑定到对象

给出以下示例代码:

int var;
int mvar;
std::mutex mvar_mutex;

void f(){
    mvar_mutex.lock();
    mvar = var * var;
    mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

我想表达它mvar_mutex绑定到变量mvar并仅保护该变量.mvar_mutex不应该保护,var因为它不受约束.因此,允许编译器将上面的代码转换为以下代码:

int var;
int mvar;
std::mutex mvar_mutex;

void f(){
    int r = var * var; //possible data race created if binding is not known
    mvar_mutex.lock();
    mvar = r;
    mvar_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

这可能会减少锁定上的争用,因为在保持锁定时工作量较少.

为此int可以使用std::atomic<int> mvar;和删除mvar_mutex,但对于其他类型,std::vector<int>这是不可能的.

如何以C++编译器理解并进行优化的方式表达互斥变量绑定?对于未绑定到该互斥锁的任何变量,应该允许在互斥锁边界上向上或向下重新排序任何变量

由于代码是使用生成的,clang::ASTConsumer并且clang::RecursiveASTVisitor我愿意使用非标准扩展和AST操作,只要clang(理想情况下是clang 4.0)支持它们并且生成的代码不需要优雅或人类可读.

编辑,因为这似乎导致混淆:上述转换在C++中是不合法的.所描述的互斥锁与变量的绑定不存在.问题是如何实现或实现相同的效果.

c++ multithreading llvm-clang c++14

23
推荐指数
3
解决办法
1050
查看次数

使用new与decltype

T *t; //T is an implementation detail
t = new T; //want to avoid naming T to allow for flexibility
t = new decltype(*t); //error: cannot use 'new' to allocate a reference
t = new std::remove_reference<decltype(*t)>::type(); //clunky
Run Code Online (Sandbox Code Playgroud)

回答了为什么decltype(*t)返回T &而不是T.

我可以把我的最后一行放到一个宏中,但这似乎不是最理想的.有没有比我到目前为止更好的解决方案?这是否属于Code Review

c++ decltype c++11

16
推荐指数
2
解决办法
2102
查看次数

将std :: unique_ptr类成员标记为const

许多用于std::unique_ptr管理类依赖项所有权的示例如下所示:

class Parent
{
public:
    Parent(Child&& child) :
    _child(std::make_unique<Child>(std::move(child))){}
private:
    std::unique_ptr<Child> _child;
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,标记该_child成员是否const有任何意想不到的副作用?(除了是保证reset(),release()等不能被称为_child).

我问,因为我还没有在一个例子中看到它,不知道这是故意还是仅仅是为了简洁/普遍.

c++ smart-pointers ownership unique-ptr c++11

8
推荐指数
1
解决办法
1419
查看次数

ld:无法识别的选项'--push-state - no-as-needed'

我的构建失败,出现以下链接器错误消息:

FAILED :: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined,address -Wno-unused-parameter -fsanitize = undefined,address -dynamic*.o -o SCE -Wl,-rpath,/opt/qt59/lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lgrpc ++ /opt/qt59/lib/libQt5Gui.so.5.9.1 /opt/qt59/lib/libQt5Core.so.5.9.1&&:/
usr/bin/x86_64-linux-gnu-ld:无法识别的选项'--push-state - no-as-needed'

您可以在此处查看完整的构建日志.错误在第2211行,版本在第2104ff行打印.

哪个工具导致错误?

  • gcc 7.3.0使用了不正确的链接器标志?的ld文档表示--push-state--no-as-needed是分开的命令.
  • ld 2.28太老了解链接器标志?在更改日志没有列出任何似乎与.
  • 命令&& /usr/bin/g++看起来很奇怪,应该是/usr/bin/g++.使用make而不是ninja显示相同的链接错误.

它正确地建立在其上使用Debian测试gcc 7.3.0以及和ld 2.30,但似乎没有成为一个工作binutils-2.30Ubuntu的忠实的PPA.

如何在Travis上成功构建我的项目?

gcc linker-errors ld ubuntu-14.04

8
推荐指数
1
解决办法
2970
查看次数

从另一个文件运行unittests

我有一个具有单元测试的文件TestProtocol.py.我可以运行该脚本并按预期获得我的30个测试的测试结果.现在我想从tester.py位于同一目录中的另一个文件运行这些测试.在里面tester.py我尝试了import TestProtocol,但它运行0测试.

然后我找到了说我应该这样做的文档:

suite = unittest.TestLoader().discover(".", pattern = "*")
unittest.run(suite)
Run Code Online (Sandbox Code Playgroud)

这应该遍历当前目录.中与模式匹配的*所有文件,因此所有文件中的所有测试都是如此.不幸的是,它再次运行0次测试

有一个相关的质量保证建议做

import TestProtocol
suite = unittest.findTestCases(TestProtocol)
unittest.run(suite)
Run Code Online (Sandbox Code Playgroud)

但是也没有找到任何测试.

如何导入和运行我的测试?

python python-unittest

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

非类功能可以私有化吗?

我在我创建的命名空间中有一些函数在我的程序中使用.

在头文件中:

namespace NQueens
{
    static int heur = 0;
    int CalcHeuristic(char** state, int size);
    void CalcHorzH(char ** state, int &heuristic, int size);
    void CalcColH(char ** state, int &heuristic, int size);
    void CalcDiagH(char ** state, int &heuristic, int size);
    int calcCollisions(int queensPerRow, int size);
}
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,从我的外部程序代码实际调用的唯一函数是CalcHeuristic(char** state, int size)函数.然后该函数调用其他函数本身.

由于这些不属于某个类,我的编译器不会让我声明其他函数private.有没有办法做到这一点?我应该担心吗?

c++

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

使用fstream构造函数和open函数之间的区别

我有一个关于fstream的构造函数和.open函数的简单问题.以下两个表达式之间是否有任何差异?

1

fstream("file.txt",ios::app);
Run Code Online (Sandbox Code Playgroud)

2

fstream fin;
fin.open("file.txt",ios::app);
Run Code Online (Sandbox Code Playgroud)

对于(1),我不需要再次使用.open函数了吗?两个表达式之间的任何功能差异?

我的第二个问题是,如果我将openmode留空,那么默认的开放模式是什么?

c++ io fstream

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

根据访问说明符使用特定重载函数的声明

这段代码

struct Foo{
    void f(){
        f(0);
    }
private:
    void f(int){}
};

struct Bar : private Foo{
    using Foo::f;
};

int main() {
    Bar b;
    b.f();
}
Run Code Online (Sandbox Code Playgroud)

无法编译,因为Foo::f(int)private. 我不感兴趣Foo::f(int),我只是想要Foo::f()哪个public,所以我觉得应该有办法做到这一点。

我能想到一些解决方法:

  1. 重命名Foo::f(int)Foo::p_f(int),但这是多余的并且不允许重载解析f
  2. 实现需要对多个对象Bar::foo(){Foo::f();}进行大量复制/粘贴public f
  3. 继承publicly 并Foo邀请 UB 因为~Foo()不是virtual(也不应该是)
  4. 使所有fspublic很容易意外Foo损坏Bar

有办法说吗using public Foo::f;?或者使用其中一种没有相关缺点的解决方法?

c++

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