小编Jan*_*ner的帖子

克隆存储闭包的结构

我目前正在尝试在Rust中实现一个简单的Parser-Combinator库.为此,我希望有一个泛型map函数来转换解析器的结果.

问题是我不知道如何复制持有闭包的结构.示例是Map以下示例中的结构.它有一个mapFunction存储函数的字段,它接收前一个解析器的结果并返回一个新结果.Map它本身就是一个可以与其他解析器进一步组合的解析器.

但是,对于要组合的解析器,我需要它们是可复制的(具有Clone特征限制),但是我该如何提供Map呢?

示例:(只有伪代码,很可能无法编译)

trait Parser<A> { // Cannot have the ": Clone" bound because of `Map`.
    // Every parser needs to have a `run` function that takes the input as argument
    // and optionally produces a result and the remaining input.
    fn run(&self, input: ~str) -> Option<(A, ~str)>
}

struct Char {
    chr: char
}

impl Parser<char> for Char {
    // The char parser returns Some(char) if …
Run Code Online (Sandbox Code Playgroud)

rust rust-0.9

9
推荐指数
1
解决办法
729
查看次数

为数值数组创建别名

我想创建一个std::array只有数字类型的别名

template<typename T, std::size_t n, T = std::is_arithmetic<T>::value>
using NumericArray = std::array<T, n>;
Run Code Online (Sandbox Code Playgroud)

这适用于整数

NumericArray<int, 2> i{1, 2};
Run Code Online (Sandbox Code Playgroud)

但是,如果我想要一个浮点数或双精度,我会因非类型模板参数而出错

NumericArray<float, 2> f{1.0f, 2.0f};
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以做到这一点吗?

c++ c++11 c++14

9
推荐指数
2
解决办法
409
查看次数

为什么Vulkan的VkBool32实现为unsigned int?

通过在GitHub上托管的Sascha Willem的C++ Vulkan演示,我注意到一些函数返回了数据类型VkBool32.

我很好奇为什么当我注意到Line时,Khronos没有使用普通的bool

typedef uint32_t VkBool32;

在vulkan.h.uint32_t定义为

typedef unsigned int uint32_t;

在stdint.h中.

我的问题是,如果一个标准的Bool只用一个字节来完成这个工作,为什么它会让Sense丢掉3个字节?我的小Recherche显示没有性能差异(请参阅哪个更快:if(bool)或if(int)?),而Khronos他们自己说他们希望最小化兼容性问题(在这种情况下,旧C没有原始布尔类型)以便专注于现代代码.

(见Trevett的报价取自这里)

一个彻底的重新设计,我们不向后兼容

c c++ performance vulkan

7
推荐指数
1
解决办法
558
查看次数

传递派生类型列表以将其存储为成员

我上课了widget.
我有一个抽象类base与衍生物derived_a,derived_b等等.

我希望widget保留任意数量的派生对象,base以便以后以多态方式使用它们.

我的第一次尝试看起来像这样:

#include <vector>
#include <ostream>
#include <iostream>
#include <memory>

class widget {
public:
    explicit widget(std::vector<std::unique_ptr<base>>&& params) :
    members {std::move (params)}
    {            
    }

private:
    std::vector<std::unique_ptr<base>> members;
};
Run Code Online (Sandbox Code Playgroud)

并将被称为这样:

std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
widget w (std::move(v));
Run Code Online (Sandbox Code Playgroud)

但是,这个解决方案接口冗长,而不是用户友好,特别是在提供多种类型时:

std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
widget w {std::move(v)};
Run Code Online (Sandbox Code Playgroud)

相反,我更喜欢沿着这条线使用

widget w {derived_a(), 
          derived_b(), 
          derived_c(), 
          derived_a(), 
          derived_b(), 
          derived_c()};
Run Code Online (Sandbox Code Playgroud)

因此,widget它提供了一个随后可以变成的右值列表std::vector<unique_ptr<base>>.
我的印象是,这可以通过模仿ctor来实现,但是,尽管谷歌搜索量很大,但我并不知道如何准确地实现我的目标.

请注意,类模板解决方案看起来像这样:

widget<derived_a, 
       derived_b, 
       derived_c, 
       derived_a, …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism templates c++11 c++14

5
推荐指数
1
解决办法
119
查看次数

读取/将结构写入二进制文件

我正在运行一个有3个结构的程序,我在二进制文件中读/写的操作如下:

struct Medico
{
    int Id_Doctor;
    int Estado;
    char Nombre[60];
    char Clave_Acceso[20];
    char Especialidad[40]; 
    struct Medico *next;
};

typedef struct Medico *Medicazos;
typedef struct Medico Meds;

Medicazos Nuevo;
FILE *Archivaldo;
char especialida[40], password[20];
char nombre_doc[60];
int estado_doc, id_doc;

Archivaldo=fopen("md.dat", "rb");
fclose(Archivaldo);

if((Archivaldo=fopen("md.dat", "rb"))==NULL)
{
    printf("No se pudo abrir el archivo de Medicos\n"); //couldnt open file msg
    exit(1);
}

rewind(Archivaldo);
while(!feof(Archivaldo))
{
    if(*Inicio != NULL)  //read from file and write in struct
    {
        Nuevo = (Medicazos) malloc (sizeof(Meds)); //new=pointer
        fread(&id_doc, sizeof(int), …
Run Code Online (Sandbox Code Playgroud)

c file-io structure

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

为什么我的递归Fibonacci实现与迭代实现相比如此之慢?

我创建了以下简单的Fibonacci实现:

#![feature(test)]
extern crate test;

pub fn fibonacci_recursive(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
    }
}

pub fn fibonacci_imperative(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => {
            let mut penultimate;
            let mut last = 1;
            let mut fib = 0;
            for _ in 0..n {
                penultimate = last;
                last = fib;
                fib = penultimate + last; …
Run Code Online (Sandbox Code Playgroud)

recursion performance benchmarking rust

4
推荐指数
1
解决办法
545
查看次数

如何检索Rust编译器插件中绑定的特征的完整路径?

我正在研究一个需要访问特征绑定的绝对路径的Rust插件.实际上,这意味着对于以下代码,我想解析Debugas 的完整路径std::fmt::Debug.

use std::fmt::*;

#[foo]
trait Foo: Debug {}
Run Code Online (Sandbox Code Playgroud)

我目前的做法包括采取的AnnotatableMultiItemDecorator为我和图案化,匹配 Annotatable::Item,在这里我匹配.nodeItemKind::Trait.然后我匹配.generic_boundsGenericBound::Trait我检索的集合.trait_ref.path.

但是这个结构只包含path(Debug),这对我来说不够.

rust

4
推荐指数
1
解决办法
46
查看次数

生锈的可启动hello world程序

我最近遇到了Rust,发现可以轻松地在Rust中编写系统代码而无需触及程序集.
我只是想从我的hello.rs代码中创建一个可启动的hello world程序:

fn main() {
    println!("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使这个Rust代码可启动?

operating-system bootable rust

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