gpt4 book ai didi

rust - 在Rust中为常量提供通用结构的更简单方法

转载 作者:行者123 更新时间:2023-12-03 11:43:26 26 4
gpt4 key购买 nike

我有一个'Indexer'类型,可以向前(+1)或向后(-1)。在C++中:

enum Direction {
Forward,
Backward
};

template <Direction Dir>
struct Indexer {
static constexpr int delta = (Dir == Forward ? 1 : -1);
};

void foo() {
Indexer<Forward> f;
}

我想在Rust中实现这一点。这是我想出的最好的方法:

use std::marker::PhantomData;

#[derive(Copy, Clone)]
pub struct Forward;

#[derive(Copy, Clone)]
pub struct Backward;

pub trait Direction : Copy {
const DELTA: i32;
}

impl Direction for Forward {
const DELTA: i32 = 1;
}

impl Direction for Backward {
const DELTA: i32 = -1;
}

#[derive(Copy, Clone)]
pub struct Indexer<Dir: Direction> {
pd: PhantomData<Dir>
}

impl<Dir: Direction> Indexer<Dir> {
const DELTA:i32 = Dir::DELTA;
}

pub fn run() {
let idx = Indexer::<Forward>{pd: PhantomData{}};
}

PhantomData似乎是必需的,因为我没有在字段中存储Direction,而这又需要很多样板。有没有更简单的方法来移植此C++代码?我希望避免使用宏或 crate 。

最佳答案

我想出了一些我在项目中使用的东西(直到rust支持const泛型):

use std::fmt;

pub trait TStaticValue<
V: Copy/*prevent interior mutation (suggested by clippy)*/
> : Sync + 'static + Clone + fmt::Debug { // these bounds turned out to be convenient for me
const VALUE : V;
}

macro_rules! define_static_value {(pub $struct: ident, $type: ty, $value: expr) => {
#[derive(Clone, Debug)]
pub struct $struct {}
impl TStaticValue<$type> for $struct {
const VALUE : $type = $value;
}
}}

然后, define_static_value将允许您定义以下内容:
define_static_value!(pub ForwardDelta, i32, 1);
define_static_value!(pub BackwardDelta, i32, -1);

pub struct Indexer<Dir: TStaticValue<i32>> {
pd: std::marker::PhantomData<Dir>
}

impl<Dir: TStaticValue<i32>> Indexer<Dir> {
const DELTA:i32 = Dir::VALUE;
}

我知道您想避免使用宏,但是对于我来说,这种解决方案相对来说是可维护的,因为所有“静态值”(即const通用参数)都以相同的方式进行仿真,并且允许您临时定义和使用它们。具有不同类型的数据,并且都通过相同的体系结构:每当您实际需要类型为 Param的const通用参数 CG时,都可以改为指定 Param: TStaticValue<CG>

您可能还需要调整 define_static_value以允许使用非 pub值。

关于 PhandomData的说明:到目前为止,我还没有找到一种方法可以避免这种情况,但是您可以通过将所有其他未使用的参数打包到该相应字段中来确保每个结构最多具有一个 PhantomData成员(然后将具有类型 PhantomData<(FirstUnused, SecondUnused, ThirdUnused)>

关于rust - 在Rust中为常量提供通用结构的更简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com