小编Mic*_*uza的帖子

是否可以在特征中声明类型别名?

现有语法允许我们为关联类型编写默认值:

trait Foo {
    type Bar = i32;
}
Run Code Online (Sandbox Code Playgroud)

我想要类似 C++ 的东西:

trait Foo {
    typedef int Bar;
}
Run Code Online (Sandbox Code Playgroud)

这不是有效的 Rust 代码,但试图表明我的意图:

trait Foo<T> {
    trait Trait = Into<T> + /* 10 other traits dependent on T */;
    
    fn foo(x: Type) -> Trait;
}
Run Code Online (Sandbox Code Playgroud)

traits rust type-alias

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

在D中迭代const集合

在C++(STL)中,我们定义了const和非const方法以及两种用于迭代集合的迭代器:

class Container
{
    public:
    iterator begin();
    const_iterator begin() const;
};
Run Code Online (Sandbox Code Playgroud)

我们如何将这种技术扩展到D?我的第一次尝试:

class Container(T) {
    class Range {
        ref T front();
        // implementation
    }

    class ConstRange {
        T front() const;
        // implementation
    }

    Range all() {
        return new Range(/**/);
    }

    ConstRange all() const {
        return new ConstRange(/**/);
    }
}

unittest {
    alias list = List!int;
    const list L = new list;
    writeln(L.all());
}
Run Code Online (Sandbox Code Playgroud)

但它失败了.我有一个错误: Error: nested type List.List!int.List.Range should have the same or weaker constancy as enclosing type const(List!int)

怎么了?

iterator d const

3
推荐指数
1
解决办法
101
查看次数

Rust:有条件的 trait 继承

例如,我想在 Rust 中为容器编写 trait:

trait Container: Default {
    type ValueType;
}
Run Code Online (Sandbox Code Playgroud)

但我也希望所有的Containers 也可以是Cloned 只有当Container::ValueType可以是Cloned 时:

// not Rust code
trait Container: Default + Clone if Self::ValueType: Clone {
    type ValueType;
}
Run Code Online (Sandbox Code Playgroud)

当然,我可以有条件地Clone为具体容器本身实现trait:

struct MyVec<T> {}

impl<T: Clone> Clone for MyVec<T> {/**/}
Run Code Online (Sandbox Code Playgroud)

或使用derive(Clone),但我想表达我对Containertrait 的意图,而不是为了实现类型。

traits rust

3
推荐指数
1
解决办法
193
查看次数

如何在使用SFINAE时忽略返回类型

我有这段代码:

template <typename T, typename R>
struct is_dereferenceable_exact
{
    typedef char yes;
    typedef struct { char dummy[2]; } no;

    template <typename U, R (U::*)() const>
    struct SFINAE;

    template <typename U>
    static yes  test(SFINAE<U, &U::operator*>*);

    template <typename U>
    static no   test(...);

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
Run Code Online (Sandbox Code Playgroud)

此结构用于检查给定类型是否可解除引用,并且取消引用的结果具有类型  R.我使用省略号的旧方法,而sizeof不是void_t或故意检测成语 - 我想只使用C++ - 03特征(如果可能的话).

但我只是不能写出类似的结构,它只能确定是否存在T::operator*忽略它的类型.你能帮助我吗?

UPD我可以概括一下我的问题:如果我可以使用返回类型编写一些特征,我可以像上面的引子一样消除它们吗?

c++ templates sfinae visual-studio-2013

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

标签 统计

rust ×2

traits ×2

c++ ×1

const ×1

d ×1

iterator ×1

sfinae ×1

templates ×1

type-alias ×1

visual-studio-2013 ×1