是否有任何c ++标准段落表示使用-1此方法是可移植和正确的方法或正确执行此操作的唯一方法是使用预定义值?
我有一个谈话与我的同事,什么是更好的:使用-1最多的无符号整数,或者使用从价值limits.h还是std::numeric_limits?
我已经告诉我的同事,使用预定义的最大值,limits.h或者std::numeric_limits是这样做的便携和干净的方式,然而,同事反对-1像数字限制一样可移植,而且更多,它还有一个优点:
unsigned short i = -1; // unsigned short max
Run Code Online (Sandbox Code Playgroud)
可以轻松更改为任何其他类型,如
unsigned long i = -1; // unsigned long max
Run Code Online (Sandbox Code Playgroud)
当使用limits.h头文件中的预定义值时,或者std::numeric_limits还需要将其与左侧的类型一起重写.
std::byte是C++ 17中的新类型,它是作为enum class byte : unsigned char.如果没有适当的转换,这将无法使用它.所以,我为这种类型的向量做了一个别名来表示一个字节数组:
using Bytes = std::vector<std::byte>;
Run Code Online (Sandbox Code Playgroud)
但是,它不可能在旧式中使用它:接受它作为参数的函数失败,因为这种类型不能轻易转换为旧std::vector<unsigned char>类型,例如,zipper库的用法:
/resourcecache/pakfile.cpp: In member function 'utils::Bytes resourcecache::PakFile::readFile(const string&)':
/resourcecache/pakfile.cpp:48:52: error: no matching function for call to 'zipper::Unzipper::extractEntryToMemory(const string&, utils::Bytes&)'
unzipper_->extractEntryToMemory(fileName, bytes);
^
In file included from /resourcecache/pakfile.hpp:13:0,
from /resourcecache/pakfile.cpp:1:
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: candidate: bool zipper::Unzipper::extractEntryToMemory(const string&, std::vector<unsigned char>&)
bool extractEntryToMemory(const std::string& name, std::vector<unsigned char>& vec);
^~~~~~~~~~~~~~~~~~~~
/projects/linux/../../thirdparty/zipper/zipper/unzipper.h:31:10: note: no known conversion for argument 2 from 'utils::Bytes {aka std::vector<std::byte>}' to 'std::vector<unsigned char>&'
Run Code Online (Sandbox Code Playgroud)
我试图表演天真的演员,但这也没有帮助.那么,如果它被设计为有用,它在旧的上下文中是否真的有用?我看到的唯一方法是 …
我已经读过(这里,例如)register在C++ 11中不推荐使用该关键字.因此,在标准的较新版本中是否存在与此存储类说明符等效的内容,或者它是否由编译器处理?
在c(或asm)中链接类似hello-world的程序时gcc,会在结果可执行对象文件中添加一些内容.我只知道运行时动态链接器和_start入口点,但这些添加的函数是什么类型的?
00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
0000000000400470 t __do_global_dtors_aux
0000000000400490 t frame_dummy
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
0000000000400554 T _fini
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end
Run Code Online (Sandbox Code Playgroud)
他们是什么,为了什么?是在某处描述的吗?谷歌搜索没有帮助.
假设我们有一个向量:
let a = vec![1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
迭代元素的最佳和最短的方法是什么,以便在第一次迭代中我收到一个元组(1, 2),并在下一次迭代中收到 - (2, 3),直到没有元素,所以不会产生(3, None)或类似的东西?看起来a.chunks(2)有点不同,它以 2 为步长,而我需要在集合中的每两个连续元素上以 1 为步长。
我在我的箱子中添加了一个功能,增加了serde支持.但是,我不太明白如何正确使用它:
// #[derive(Debug, Serialize, Deserialize, Clone)] // goes to:
#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")]
#[derive(Serialize, Deserialize)]
pub struct MyStruct;
Run Code Online (Sandbox Code Playgroud)
这段代码将下面的所有内容cfg(feature)视为有条件编译,因此如果没有我的serde_support功能,我的箱子也没有MyStruct.
我试图用大括号包装它,但它给出了另一个错误:
码:
#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")] {
#[derive(Serialize, Deserialize)]
}
pub struct MyStruct;
Run Code Online (Sandbox Code Playgroud)
错误:
error: expected item after attributes
--> mycrate/src/lib.rs:65:33
|
65 | #[cfg(feature = "serde_support")] {
| ^
Run Code Online (Sandbox Code Playgroud)
那怎么做?
我想chrono::NaiveDate使用自定义函数序列化和反序列化,但Serde书籍不包含此功能,代码文档也没有帮助.
#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;
extern crate chrono;
use chrono::NaiveDate;
mod date_serde {
use chrono::NaiveDate;
use serde::{self, Deserialize, Serializer, Deserializer};
pub fn serialize<S>(date: &Option<NaiveDate>, s: S) -> Result<S::Ok, S::Error>
where S: Serializer {
if let Some(ref d) = *date {
return s.serialize_str(&d.format("%Y-%m-%d").to_string())
}
s.serialize_none()
}
pub fn deserialize<'de, D>(deserializer: D)
-> Result<Option<NaiveDate>, D::Error>
where D: Deserializer<'de> {
let s: Option<String> = Option::deserialize(deserializer)?;
if let Some(s) = s {
return Ok(Some(NaiveDate::parse_from_str(&s, "%Y-%m-%d").map_err(serde::de::Error::custom)?))
} …Run Code Online (Sandbox Code Playgroud) 为什么使用此代码编程有时会打印"2"?
int main() {
std::atomic<int> a;
a = 0;
std::thread t1([&]{++a;});
std::thread t2([&]{a++;});
std::thread t3([&]{
a = a.load() + 1;
});
t1.join();
t2.join();
t3.join();
if (a != 3) {
std::cout << "a: " << a << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为std::atomic保证所有操作都将以原子方式完成,因此写入(递增)将使用内存屏障,我们将始终3在线程结束时工作.我已经探索了代码,发现问题线程是t3但我无法理解为什么它是错误的.
我有一个可观察的集合和一个观察者.我希望观察者成为一个特质实现trait Observer.当某些事件发生时,可观察对象应该能够通知每个观察者.这应该解释我的意图:
struct A {
observables: Vec<Observable>,
}
impl A {
fn new() -> A {
A {
observables: vec![],
}
}
}
trait Observer {
fn event(&mut self, _: &String);
}
impl Observer for A {
fn event(&mut self, ev: &String) {
println!("Got event from observable: {}", ev);
}
}
struct Observable {
observers: Vec<dyn Observer>, // How to contain references to observers? (this line is invalid)
}
impl Observable {
fn new() -> Observable {
Observable …Run Code Online (Sandbox Code Playgroud) 我尝试编译非常简单的代码:
struct T {
int a[3];
int b;
int c;
};
int main() {
const int as[3] = { 5, 6, 7, };
const T t {
as, 2, 3,
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它给了我很奇怪的错误:
t.cpp: In function 'int main()':
t.cpp:11:5: error: array must be initialized with a brace-enclosed initializer
};
^
Run Code Online (Sandbox Code Playgroud)
根据我的理解,编译器希望我在一个地方初始化所有内容.如何单独初始化字段,然后在初始化结构时使用它们?