我有
trait Invoker {
val method: Method
}
Run Code Online (Sandbox Code Playgroud)
Intellij IDEA代码检查警告我"特征中使用的抽象值".一切都很好.在特质中使用抽象值有什么问题吗?如果是这样,我应该如何指定特征的所有扩展器必须定义方法属性?
而不是写town->first我想写town->name.内联命名访问器(重命名地图迭代器和命名std :: pair成员的第一个和第二个)是我到目前为止找到的最佳解决方案.我对命名访问器的问题是类型安全性的丢失:
pair<int,double>可能是指struct { int index; double value; }或者struct { int population; double avg_temp; }.任何人都可以提出一个简单的方法,也许类似于特征?
我经常想从一个函数返回一对或一个元组,struct city { string name; int zipcode; }每次引入一个类似的新类型和它的ctor 是非常累人的.我很高兴了解boost和C++ 0x但我需要一个没有提升的纯C++ 03解决方案.
更新
Re andrewdski的问题:是的,一个(假设的)语法就像pair<int=index, double=value>创建一个不同的类型来pair<int=population, double=avg_temp>满足你的要求.我甚至不介意实现一个自定义的对/元组模板类ONCE,只是当我需要一个新类型时,只是将'name traits'模板参数传递给它.我不知道'名称特征'会是什么样子.也许这是不可能的.
我有一个特点.为了创造力,让我们称之为特质Trait:
trait Trait{
static function treat($instance){
// treat that trait instance with care
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我还有一个使用这个特性的类,User.当尝试使用User实例调用treat时,一切正常.但我想输入提示,只有使用Trait的类的实例应该作为参数给出,如下所示:
static function treat(Trait $instance){...}
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,这会导致致命的错误,该错误表明该函数期待Trait的一个实例,但是给出了一个User实例.这种类型的提示适用于继承和实现,但我如何键入提示特征?
我想实现这个Shl特性Vec,代码如下.这会使事情变得vec << 4可能,这对于它来说是个不错的选择vec.push(4).
use std::ops::Shl;
impl<T> Shl<T> for Vec<T> {
type Output = Vec<T>;
fn shl(&self, elem: &T) -> Vec<T> {
self.push(*elem);
*self
}
}
fn main() {
let v = vec![1, 2, 3];
v << 4;
}
Run Code Online (Sandbox Code Playgroud)
编译失败,出现以下错误:
无法提供扩展实现,其中特征和类型都未在此包中定义[E0117]
要么
type参数
T必须用作某些本地类型的类型参数(例如MyStruct<T>); 只有当前包中定义的特征才能为类型参数实现[E0210]
据我了解,我必须修补stdlib,更具体地来说是collections::vec板条箱.有没有其他方法可以更改此代码以成功编译?
我正在尝试创建一个返回Shader特征实例的函数.这是我极为简化的代码:
trait Shader {}
struct MyShader;
impl Shader for MyShader {}
struct GraphicsContext;
impl GraphicsContext {
fn create_shader(&self) -> Shader {
let shader = MyShader;
shader
}
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
error[E0277]: the trait bound `Shader + 'static: std::marker::Sized` is not satisfied
--> src/main.rs:10:32
|
10 | fn create_shader(&self) -> Shader {
| ^^^^^^ `Shader + 'static` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `Shader …Run Code Online (Sandbox Code Playgroud) C++中的特征封装了一系列操作,这些操作允许算法或数据结构使用与其实例化的类型的操作符.char_traits是分组string和文件所需功能的示例.
但并非所有特质都在他们的名字中有"特质",对吧?numeric_limits浮现在脑海中.这也是"特质"吗?即使没有名称"特质"吗?
那么,是否有其他模板可以/应该被视为"特征"?除了我发现的例子:
allocator_traits 如何获得记忆pointer_traits 如何间接访问对象type_traits 元编程char_taits 符号序列iterator_traits 如何前进,后退和元素regex_traits 为...正则表达式.我想,我要问的是,是否有一个纯粹的特征定义?
我特别不确定的一些事情是:
numeric_limits 上文提到的<chrono>定制"特征",[20.11.4],即 duration_valueshash<>算子可以被认为是一种特质吗?更新:究竟是什么让特质成为特质似乎在细节上有点争议.也许可以回答另一个问题:是否有一个全面的列表,哪些类似特征的类对C++ 0x来说是新的,哪些已经在C++ 03中?也许有人知道某个地方的链接?
更新:在我对这个问题的思考中并不孤单,这似乎确实是一个错误.看到这里.它修复的那一天将是一个美好的一天!:)
这开始了I love PHP traits! I'm going to use them everywhere! ^_^,现在它变成了一个Thought Exercise / Learning Experience >_<.
请考虑以下示例:
trait TheErrorOfYourWays{
public function booboo(){
echo 'You had a booboo :(';
}
}
trait SpectacularStuff1 {
use TheErrorOfYourWays;
}
trait SpectacularStuff2 {
use TheErrorOfYourWays;
}
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2;
}
Run Code Online (Sandbox Code Playgroud)
这导致(显然不那么明显):
致命错误:Trait方法booboo尚未应用,因为在DoSomethingSpectacular上存在与其他特征方法的碰撞.
所以我的问题是:如何解决特征中的方法冲突?是否有可能实现重叠特质"继承"?如果是这样,那么"正确"的方法是什么?
为什么我要这样做:
我尝试过的:
是否可以声明var_b与另一个变量相同类型的变量var_a?
例如:
template <class T>
void foo(T t) {
auto var_a = bar(t);
//make var_b of the same type as var_a
}
F_1 bar(T_1 t) {
}
F_2 bar(T_2 t) {
}
Run Code Online (Sandbox Code Playgroud) 是否可以将traits中的函数定义为具有impl Trait返回类型?我想创建一个可以由多个结构实现的特征,以便new()所有这些特征的函数返回一个对象,它们都可以以相同的方式使用,而无需编写特定于每个结构的代码.
trait A {
fn new() -> impl A;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
impl Trait不允许在函数和固有方法返回类型之外
这只是impl TraitRust 当前实现的限制还是我使用它错了?
traits ×10
c++ ×3
php ×3
rust ×3
c++11 ×2
class ×2
templates ×2
instanceof ×1
scala ×1
stl ×1
type-hinting ×1
type-traits ×1
typedef ×1