小编Ale*_*ara的帖子

使用 C++20 概念为自定义容器创建迭代器

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 版本中为自定义容器编写自定义迭代器吗?

c++ c++-concepts c++20

19
推荐指数
1
解决办法
5417
查看次数

使用 Clang 创建静态和共享库

使用under和commmand line创建静态库和动态库,然后将其链接到可执行文件的最小方法是什么?ClangLinuxWindows

假设项目包含一个main.cpp具有该功能的文件mainlib_header.h下一个文件/include/project_name和一个lib_source.c or lib_source.cpp/src

谢谢

c++ linker clang static-libraries dynamic-library

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

如何使用 proc-macro 获取 Vec&lt;T&gt; 中枚举的所有变体?

我想知道如何为任何枚举实现一种方法,该方法将返回一种Vec<T>或某种集合类型中的所有变体。就像是:

pub enum MyEnum {
    EnumVariant1
    EnumVariant2
    ...
}

impl MyEnum {
    fn values(&self) -> Vec<MyEnum> {
        // do Rust stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

enums rust

6
推荐指数
1
解决办法
2562
查看次数

在 C++20 上有条件导入模块

有没有办法在没有预处理器指令的情况下有条件地导入模块C++20

伪代码:

if WINDOWS:
    import my_module;
else:
    import other_module;
Run Code Online (Sandbox Code Playgroud)

如果没有办法,使用预处理器最干净的方法是什么?

c++ c++20 c++-modules

6
推荐指数
1
解决办法
674
查看次数

Proc宏执行顺序

我有一个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 macroattribute macro作者是)中的数据

macros rust rust-proc-macros

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

存储结构的引用并反序列化它们

我正在解析一个 toml 配置文件并将其内容检索到一些结构中,使用serdetoml

因此,配置结构可以定义如下:

#[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 中使用生命周期验证这些引用,以便我的结构可以开始保存引用而不是拥有的值。

reference reference-type rust owned-types

0
推荐指数
1
解决办法
93
查看次数

静态检查越界

我有这个方法,它只获取成员的一个元素,这是一个 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++ assertion

0
推荐指数
1
解决办法
206
查看次数

在标识符上重载“”_something运算符

是否可以在 中C++重载""_something函数标识符或可调用函数的运算符以使其具有自定义行为?

我最近在这个 cppcon 视频中看到了类似的内容,其中演示者展示了如何使用模块、零宏构建单元测试框架......但我不太明白这是如何""_test可能的,或者如何C++理解该可调用应该执行这种操作定义在运算符重载实现的主体中。

template <typename T>
auto "some_name"_test(T a, T b);
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这背后的细节吗?

c++ operator-overloading c++20

0
推荐指数
1
解决办法
98
查看次数