我正在尝试找到一种方便的方法来初始化'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) 我有以下数据,我需要把它全部放在一行.
我有这个:
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) 我刚刚看到 C++ 23计划弃用std::aligned_storageandstd::aligned_storage_t以及std::aligned_union。std::aligned_union_t
据我所知,在对齐存储中放置新对象并不是特别constexpr友好,但这似乎不是完全丢弃该类型的好理由。这让我假设使用std::aligned_storage和朋友还存在一些我不知道的其他基本问题。那会是什么?
是否有建议替代这些类型?
嘿,现在已经有一段时间了,我正在为命令行寻找一个pdf查看器.
因为我喜欢在Linux上没有X工作,并且经常在远程机器上工作,所以我想有一个工具来阅读pdfs.有很多非常好的图形程序(evince,okular,acroread,...)来完成这项工作,所以我认为应该至少有一个像样的文本模式工具.但我甚至不知道一个糟糕的人!
目前,我要么开始只读取pdf,要么使用pdftohtml + lynx.然而,后者不会产生非常好的输出,并且大多数文档都是不可读的,特别是如果它们包含数学公式.
谷歌有很多人说要么不可能,要么建议使用pdftohtml版本.
我意识到,这不是一个编程问题,但我正在考虑启动一个项目来实现这样的程序,除非已经有一个好的程序.
谢谢你的任何建议.
为了有效地使用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) 比方说,我有一系列具有相同原型的功能
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) 如果编译器可以证明一个类的(私有)成员从未被使用过,包括潜在的朋友,标准是否允许编译器从类的内存占用中删除这个成员?
不言而喻,这对于受保护或公共成员在编译时是不可能的,但在某些情况下,私有数据成员可能会构造这样的证明。
相关问题:
我想存储一个不平凡的类型,它是不可移动且不可复制的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)
无需改变Foo或foo();
感谢复制省略,我已经可以做到这一点:
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. 这可能是不可能的,但我是否忽略了一些事情?
虽然这里有一些关于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) 我想知道如何使用引用进行多态性,而不是指针.
为了澄清,请参阅以下最小示例:
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++ ×6
linux ×2
bash ×1
c ×1
c++11 ×1
c++23 ×1
clang ×1
command-line ×1
compilation ×1
copy-elision ×1
deprecated ×1
git ×1
git-index ×1
ncurses ×1
optimization ×1
pdf ×1
pdftotext ×1
polymorphism ×1
reference ×1
scripting ×1
sed ×1
shell ×1
staging ×1
stdoptional ×1
struct ×1
typedef ×1