小编bit*_*ask的帖子

方便的C++ struct初始化

我正在尝试找到一种方便的方法来初始化'pod'C++结构.现在,考虑以下结构:

struct FooBar {
  int foo;
  float bar;
};
// just to make all examples work in C and C++:
typedef struct FooBar FooBar;
Run Code Online (Sandbox Code Playgroud)

如果我想在C(!)中方便地初始化它,我可以简单地写:

/* A */ FooBar fb = { .foo = 12, .bar = 3.4 }; // illegal C++, legal C
Run Code Online (Sandbox Code Playgroud)

请注意,我想明确地避免使用以下表示法,因为如果我将来更改结构中的任何内容,它会让我感到沮丧:

/* B */ FooBar fb = { 12, 3.4 }; // legal C++, legal C, bad style?
Run Code Online (Sandbox Code Playgroud)

为了实现与/* A */示例中相同(或至少类似)的C++ ,我将不得不实现一个愚蠢的构造函数:

FooBar::FooBar(int foo, float bar) : foo(foo), bar(bar) {}
// -> …
Run Code Online (Sandbox Code Playgroud)

c++ struct initialization

137
推荐指数
6
解决办法
11万
查看次数

如何从文本文件中删除换行符?

我有以下数据,我需要把它全部放在一行.

我有这个:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;
Run Code Online (Sandbox Code Playgroud)

我需要这个:

22791;14336;22821;34653;21491;25522;33238;
Run Code Online (Sandbox Code Playgroud)

编辑

这些命令中没有一个完美地运行.

他们中的大多数都让这样的数据:

22791

;14336

;22821

;34653

;21491

;25522
Run Code Online (Sandbox Code Playgroud)

linux bash shell scripting sed

91
推荐指数
7
解决办法
23万
查看次数

为什么 std::aligned_storage 在 C++23 中被弃用以及使用什么替代?

我刚刚看到 C++ 23计划弃用std::aligned_storageandstd::aligned_storage_t以及std::aligned_unionstd::aligned_union_t

据我所知,在对齐存储中放置新对象并不是特别constexpr友好,但这似乎不是完全丢弃该类型的好理由。这让我假设使用std::aligned_storage和朋友还存在一些我不知道的其他基本问题。那会是什么?

是否有建议替代这些类型?

c++ memory-alignment deprecated c++23

62
推荐指数
1
解决办法
8658
查看次数

用于linux的CLI pdf viewer

嘿,现在已经有一段时间了,我正在为命令行寻找一个pdf查看器.

因为我喜欢在Linux上没有X工作,并且经常在远程机器上工作,所以我想有一个工具来阅读pdfs.有很多非常好的图形程序(evince,okular,acroread,...)来完成这项工作,所以我认为应该至少有一个像样的文本模式工具.但我甚至不知道一个糟糕的人!

目前,我要么开始只读取pdf,要么使用pdftohtml + lynx.然而,后者不会产生非常好的输出,并且大多数文档都是不可读的,特别是如果它们包含数学公式.

谷歌有很多人说要么不可能,要么建议使用pdftohtml版本.

我意识到,这不是一个编程问题,但我正在考虑启动一个项目来实现这样的程序,除非已经有一个好的程序.

谢谢你的任何建议.

linux pdf command-line ncurses pdftotext

57
推荐指数
5
解决办法
5万
查看次数

你如何git添加一个新的文件而不进行分期?

为了有效地使用git(并且按照预期),我进行了小型的原子提交,而我确实有更长的会话,我不仅要改变一件事.因此,我大量使用git add -p.但是,这对于全新的文件不起作用,因为我以后往往会忘记它们.

我想要做的是,告诉git一个新的文件,我想它来跟踪,但不是阶段,它:

示例:运行git status生成:

# On branch my-current-branch
# Your branch is ahead of 'origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files: …
Run Code Online (Sandbox Code Playgroud)

git staging git-index

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

可以在函数定义中使用函数原型typedef吗?

比方说,我有一系列具有相同原型的功能

int func1(int a, int b) {
  // ...
}
int func2(int a, int b) {
  // ...
}
// ...
Run Code Online (Sandbox Code Playgroud)

现在,我想简化他们的定义和声明.当然我可以使用这样的宏:

#define SP_FUNC(name) int name(int a, int b)
Run Code Online (Sandbox Code Playgroud)

但是我想把它保存在C中,所以我尝试使用存储说明符typedef:

typedef int SpFunc(int a, int b);
Run Code Online (Sandbox Code Playgroud)

这似乎适用于声明:

SpFunc func1; // compiles
Run Code Online (Sandbox Code Playgroud)

但不是定义:

SpFunc func1 {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
Run Code Online (Sandbox Code Playgroud)

有没有办法正确地做到这一点还是不可能?根据我对C的理解,这应该有效,但事实并非如此.为什么?


注意,gcc理解我要做的事情,因为,如果我写的话

SpFunc func1 = { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

它告诉我

error: function 'func1' is initialized like a …
Run Code Online (Sandbox Code Playgroud)

c typedef function-declaration

34
推荐指数
1
解决办法
3万
查看次数

是否允许编译器优化私有数据成员?

如果编译器可以证明一个类的(私有)成员从未被使用过,包括潜在的朋友,标准是否允许编译器从类的内存占用中删除这个成员?

不言而喻,这对于受保护或公共成员在编译时是不可能的,但在某些情况下,私有数据成员可能会构造这样的证明。


相关问题:

c++ optimization compilation language-lawyer

32
推荐指数
3
解决办法
3405
查看次数

我可以将不可移动且不可复制的函数结果复制删除为可选值吗?

我想存储一个不平凡的类型,它是不可移动且不可复制的std::optional。然而该对象是由自由函数构造的。(例子

struct Foo {
    Foo();
    Foo(Foo const&) = delete;
    Foo(Foo&&) = delete;
    Foo& operator=(Foo const&) = delete; // added for completeness
    Foo& operator=(Foo&&) = delete; // added for completeness
    ~Foo();
};
Foo foo();
Run Code Online (Sandbox Code Playgroud)

无需改变Foofoo()

感谢复制省略,我已经可以做到这一点:

Foo f1 = foo();
Run Code Online (Sandbox Code Playgroud)

这也可以编译,因为std::optional只要求存储的类型是可破坏的:

std::optional<Foo> f2;
f2.emplace();
Run Code Online (Sandbox Code Playgroud)

但我无法填写f2函数结果:

f2 = foo(); // no
f2.emplace(foo()); // no
Run Code Online (Sandbox Code Playgroud)

显然,因为这需要复制或移动Foo. 这可能是不可能的,但我是否忽略了一些事情?

c++ copy-elision stdoptional

28
推荐指数
3
解决办法
1555
查看次数

clang ++ C++ 11调用

虽然这里有一些关于clang的C++ 11支持的问题,但我似乎无法clang++吃掉我的C++ 11代码.

$ clang++ --version
clang version 2.9 (tags/RELEASE_29/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

根据clang C++ 11状态页面,我应该至少部分支持(例如直角括号),但它拒绝我测试的所有功能.

是否有任何转换来告诉clang使用C++ 11?


示例测试:

$ clang++ -stdlib=libstdc++ cpp11.cpp 
cpp11.cpp:16:33: error: a space is required between consecutive right angle brackets (use '> >')
  std::vector<std::pair<int,char>> xs;
                                ^~
                                > >
cpp11.cpp:18:8: error: C++ requires a type specifier for all declarations
  auto y = x;
  ~~~~ ^
2 errors generated
Run Code Online (Sandbox Code Playgroud)

c++ clang c++11

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

多态C++引用

我想知道如何使用引用进行多态性,而不是指针.

为了澄清,请参阅以下最小示例:

class A;

class B {
  public:
    A& a; ///////////////// <- #1
    B();
    void doStuff();
};

class A {
  public:
    virtual void doSmth() = 0;
};
void B::doStuff() {
  a.doSmth();
}

class A1 : public A {
  public:
    void doSmth() {
    }
};

B::B() : a(
    *        ////////////// <- #2
      (new A1)  /////////// <- #3
     ) {
}
Run Code Online (Sandbox Code Playgroud)

这个编译和工作,但这里最重要的一点是,a在行中#1是一个引用,所以为了能够多态地使用它(是一个真正的单词?),如行#3I 所示必须"转换指针参考"通过解除引用它.

这让我觉得有点奇怪,我想知道是否有更好的(在更清洁的意义上)方式.只有我吗?

合理

如果我根本不需要它会很好new,但是当声明(!)时B我不知道如何创建A1(!)的实例和 …

c++ polymorphism reference

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