小编ExO*_*fDe的帖子

Rust 中 fn 参数的协方差使用什么?

今天我了解到 rust 不支持 fn 参数的协变,只有它的返回类型是协变的。(参见 Rust 文档

为什么我在 Rust 中了解到这个事实?因为我试图实现一个非常简单的游戏,我将逻辑、事件处理和绘图分离为三个不同的函数,但所有函数都在相同的玩家向量上运行。

如果这是不可能的,与 C# 版本相比,Rust 中的等效项是什么?

在 C# 中,这是非常简单的Fiddle 您可以定义一个类 X 必须实现的接口 Y,并定义一个相应的委托,该委托需要该接口 Y 的 IEnumerable 作为参数。现在您可以在需要的不同方法之间共享 X 的列表只有一个接口Y。

using System;
using System.Collections.Generic;


public interface Actionable{
    void Do();
}

public interface Drawable{
    void Draw();
}

public class Player: Drawable, Actionable{

    public void Do(){
        Console.WriteLine("Action");
    }

    public void Draw(){
        Console.WriteLine("Draw");
    }
}

public class Program
{
    public delegate void DrawHandler(IEnumerable<Drawable> obj);
    public delegate void LogicHandler(IEnumerable<Actionable> obj);

    public static void gameloop(DrawHandler …
Run Code Online (Sandbox Code Playgroud)

c# covariance rust

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

N个数的二次和:C中的实现

正如您可以在标题中看到的那样,它是一个相当简单的主题.但是在实现可能的不同方法来获得N个数的二次和时,我遇到了一些非常奇怪的事情.

我实现了三个不同的版本:

  • 二次Gauß和(func:quadratGauss(int n))
  • 迭代(func:quadratIterativeClassic(int n))
  • 通过Bitoperation进行迭代(func:quadratIterativeBitoperation(int n))

所有三个函数都返回了与给定输入相同的结果.现在的大问题是.第三个功能怎么可能正常工作?该代码如下所示:

void quadratGauss(int n){

    printf("+quadratGauss: \n");
    int result = ((n*(n+1))*(2*n+1))/2;
    printf("Result: %d\n----------------\n",result);

}

void quadratIterativClassic(int n){

    int result;
    printf("+quadratIterativClassic: \n");
    for(int i;i<=n;i++)
        result += i * i;
    printf("Result: %d\n----------------\n",result);

}

void quadratIterativeBitOperation(int n){

    int result;
    printf("+quadratIterativeBitOperation: \n");

    for(int i;i<=n;i++)
        result += i^2;

    printf("Result: %d\n----------------\n",result);

}
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用XOR运算符.我原本想使用移位运算符"<<"但我也尝试过其他人.当我尝试XOR运算符时,令人惊叹的是:结果仍然与之前相同,与其他两个函数相同.我认为这是不可能的,因为XOR不是电源操作的操作符,因为C不包含这样的操作符但是我最终得到了正确的结果.

我用不同数量的不同"尺寸"测试了这些功能.每个功能的结果都没有什么奇怪的.

我不知道为什么.但必须有一个解释,不是吗?如果你有一个,我会很感激写下一个可能的原因,为什么你可以用XOR运算符来实现它.

这里整个主文件:

#include <stdlib.h>
#include <stdio.h>

#include <iostream>

#define N 5000



void sumGauss(int n)
{
printf("+sumGauss: \n");
int result = (n*(n+1)/2);
printf("Result: %d\n----------------\n",result); …
Run Code Online (Sandbox Code Playgroud)

c math

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

VC++类模板使用typedef类型实现函数

我现在有一些奇怪的事情发生了.我正在尝试使用VC++编译器编写模板类.

在我的课堂上,为了清晰起见,我得到了一些typedef.我头文件之外的实际实现

template<typename T,
    typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class Integer
{
public:
    typedef  T                      value_type;
    typedef  Integer < value_type > Self;
    typedef  Self&                  SelfReference;
    typedef  Self*                  SelfRawPointer;
    ...
public:
    SelfReference operator =(const SelfReference);
Run Code Online (Sandbox Code Playgroud)

*.tcc - 文件:

...
template<typename T> Integer<T>::SelfReference Integer<T>::operator =(const 
Integer<T>::SelfReference rhs)
{
    return this->assign(rhs);
};
...
Run Code Online (Sandbox Code Playgroud)

使用gcc过去我没有任何问题这样做,但现在在Windows上,编译器抱怨'SelfReference':C2061:语法错误:标识符'SelfReference'

我不知道出了什么问题,因为过去使用的gcc ...我错过了什么吗?如果我将函数内联编写,则不会出现此问题.我现在只是好奇为什么在Windows上我遇到了这样的问题!

c++ templates visual-c++

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

标签 统计

c ×1

c# ×1

c++ ×1

covariance ×1

math ×1

rust ×1

templates ×1

visual-c++ ×1