C++20 引入了概念,这是一种对模板函数或类可以采用的类型施加约束的智能方法。
虽然迭代器类别和属性保持不变,但改变的是执行它们的方式:C++17 之前使用标记,C++20 以来使用概念。例如,您可以使用 std::forward_iterator 概念来标记迭代器,而不是使用 std::forward_iterator_tag 标签。
同样的事情也适用于所有迭代器属性。例如,前向迭代器必须是 std::incrementable。这种新机制有助于获得更好的迭代器定义,并使编译器中的错误更具可读性。
这段文字摘自这篇文章: https ://www.internalpointers.com/post/writing-custom-iterators-modern-cpp
但作者并没有升级如何用概念在C++20上制作自定义迭代器的内容,仍然是<= C++17标签版本。
有人可以举例说明如何使用概念功能在 C++20 版本中为自定义容器编写自定义迭代器吗?
使用under和commmand line创建静态库和动态库,然后将其链接到可执行文件的最小方法是什么?ClangLinuxWindows
假设项目包含一个main.cpp具有该功能的文件main,lib_header.h下一个文件/include/project_name和一个lib_source.c or lib_source.cpp下/src
谢谢
我想知道如何为任何枚举实现一种方法,该方法将返回一种Vec<T>或某种集合类型中的所有变体。就像是:
pub enum MyEnum {
EnumVariant1
EnumVariant2
...
}
impl MyEnum {
fn values(&self) -> Vec<MyEnum> {
// do Rust stuff here
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在没有预处理器指令的情况下有条件地导入模块C++20?
伪代码:
if WINDOWS:
import my_module;
else:
import other_module;
Run Code Online (Sandbox Code Playgroud)
如果没有办法,使用预处理器最干净的方法是什么?
我有一个proc macro看起来像这样的:
#[proc_macro_attribute]
pub fn my_macro(_meta: CompilerTokenStream, input: CompilerTokenStream) -> CompilerTokenStream { //* bits of code */ }
Run Code Online (Sandbox Code Playgroud)
然后我有一个derive macro:
#[proc_macro_derive(Operations)]
pub fn operations(input: proc_macro::TokenStream) -> proc_macro::TokenStream { //* bits of code */ }
Run Code Online (Sandbox Code Playgroud)
是否可以使派生宏在属性一之后展开?
原因是我有一个箱子,里面有一些静态变量来跟踪数据。我需要读取derive macro(attribute macro作者是)中的数据
我正在解析一个 toml 配置文件并将其内容检索到一些结构中,使用serde和toml。
因此,配置结构可以定义如下:
#[derive(Deserialize, Debug)]
pub struct Config<'a> {
#[serde(borrow)]
pub server: Inner<'a>
}
Run Code Online (Sandbox Code Playgroud)
和另一个相关的:
#[derive(Deserialize, Debug)]
pub struct Inner<'a> {
pub iprop1: &'a str,
pub iprop2: &'a str,
}
Run Code Online (Sandbox Code Playgroud)
这是用于加载配置的 pub 接口:
pub fn load() -> Config<'static> {
let config_file: String = fs::read_to_string(CONFIG_FILE_IDENTIFIER)
.expect("Error opening or reading the configuration file");
toml::from_str(config_file.as_str())
.expect("Error generating the configuration")
}
Run Code Online (Sandbox Code Playgroud)
那么,问题就清楚了。我可以返回该函数拥有的数据load()。
我可以将所有&str引用更改为String,因为我无法完全理解如何正确使用 Rust 中的引用,但我想知道,是否有另一种方法可以在 Rust 中使用生命周期验证这些引用,以便我的结构可以开始保存引用而不是拥有的值。
我有这个方法,它只获取成员的一个元素,这是一个 C 样式数组。
constexpr T get(const int&& idx) const {
static_assert(idx >= sizeof(array) / sizeof(T));
return array[idx];
}
Run Code Online (Sandbox Code Playgroud)
我想静态检查参数上的值,该值将尝试恢复超出范围的成员上的元素。因此,代码将拒绝编译。
我尝试使用静态断言,但是,显然:
function parameter 'idx' with unknown value cannot be used in a constant expression
Run Code Online (Sandbox Code Playgroud)
现代 C++ 实现这一目标的惯用方法是什么?可以在编译时检查吗?
如果不是,报告非法访问成员的开销较小的版本是什么?我想保持代码无异常。
编辑:
// call site example
decltype(auto) a = collections::StackArray<int, 5>{1, 2, 3, 4, 5};
auto val = a.get(6);
Run Code Online (Sandbox Code Playgroud)
我提供了一个文字 (6),所以我认为应该在编译时检查该值。更重要的是,如果我尝试获取调用的用户输入.get(),代码也可能拒绝编译。
auto in;
cin >> in;
a.get(in) // Wrong!
Run Code Online (Sandbox Code Playgroud)
我想,但也会限制潜在的操作,例如循环数组并使用该.get()方法。即使如此,也可以使用下标运算符(无需进行边界检查)。
是否可以在 中C++重载""_something函数标识符或可调用函数的运算符以使其具有自定义行为?
我最近在这个 cppcon 视频中看到了类似的内容,其中演示者展示了如何使用模块、零宏构建单元测试框架......但我不太明白这是如何""_test可能的,或者如何C++理解该可调用应该执行这种操作定义在运算符重载实现的主体中。
template <typename T>
auto "some_name"_test(T a, T b);
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这背后的细节吗?
c++ ×5
c++20 ×3
rust ×3
assertion ×1
c++-concepts ×1
c++-modules ×1
clang ×1
enums ×1
linker ×1
macros ×1
owned-types ×1
reference ×1