所以我有这个特点来填充各种类型的数组,但是我得到了T
和F: FnMut() -> T
的冲突实现。我猜唯一的重叠点是F: FnMut() -> F
的情况,在这种情况下,函数F
返回自身并等于T
。本质上,编译器考虑了F
是FnMut() -> (FnMut() -> (FnMut() -> ...))
的可能性。
下面是无法编译的代码:
pub trait ArrayFill<T, const LENGTH: usize>
{
fn fill_into_array(self) -> [T; LENGTH];
}
impl<T, const LENGTH: usize> ArrayFill<T, LENGTH> for T
where
T: Copy
{
fn fill_into_array(self) -> [T; LENGTH]
{
[self; LENGTH]
}
}
impl<F, T, const LENGTH: usize> ArrayFill<T, LENGTH> for F
where
F: FnMut() -> T
{
fn fill_into_array(self) -> [T; LENGTH]
{
todo!()
}
}
字符串
我试过使用auto-trait和F: FnMut() -> F
的否定实现,但即使这样,冲突仍然存在,因为我不认为编译器能够正确地推理否定实现。尝试的解决方案如下所示:
#![feature(auto_traits)]
#![feature(negative_impls)]
auto trait NotFnMutToSelf {}
impl<F> !NotFnMutToSelf for F
where
F: FnMut() -> F {}
pub trait ArrayFill<T, const LENGTH: usize>
{
fn fill_into_array(self) -> [T; LENGTH];
}
impl<T, const LENGTH: usize> ArrayFill<T, LENGTH> for T
where
T: Copy + NotFnMutToSelf
{
fn fill_into_array(self) -> [T; LENGTH]
{
[self; LENGTH]
}
}
impl<F, T, const LENGTH: usize> ArrayFill<T, LENGTH> for F
where
F: FnMut() -> T
{
fn fill_into_array(self) -> [T; LENGTH]
{
todo!()
}
}
型
我不认为专门化可以解决这个问题,因为尽管实现重叠,但它们都不完全重叠。
有什么办法解决这个矛盾吗?
1条答案
按热度按时间wgeznvg71#
不幸的是,这是不可能的。像这样的情况甚至在专门化RFC中描述过,因为建议的RFC * 不会 * 解决。