现有语法允许我们为关联类型编写默认值:
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) 在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)
怎么了?
例如,我想在 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 的意图,而不是为了实现类型。
我有这段代码:
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我可以概括一下我的问题:如果我可以使用返回类型编写一些特征,我可以像上面的引子一样消除它们吗?