小编Zac*_*ack的帖子

为 RSpec 套件中的所有示例设置一次变量(不使用全局变量)

设置变量一次以供 RSpec 套件中的所有示例使用的常规方法是什么?

我目前设置了一个全局变量,spec_helper用于检查规范是否在“调试模式”下运行

$debug = ENV.key?('DEBUG') && (ENV['DEBUG'].casecmp('false') != 0) && (ENV['DEBUG'].casecmp('no') != 0)
Run Code Online (Sandbox Code Playgroud)

如何在不使用全局变量且不重新计算每个上下文和/或示例的值的情况下使该信息可用于套件中的所有示例?(我的理解是,使用before(:all)块会在每个上下文中重新计算一次;但是,这before(:suite)不能用于设置实例变量。)

(注意:我要求更多地了解解决这个特定问题的优秀设计。我知道一个全局不是什么大问题。)

ruby rspec global-variables

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

ARMv8 A64程序集中的立即值范围

我的理解是ARMv8 A64汇编中的直接参数可以是12位长.如果是这种情况,为什么这行汇编代码:

AND X12, X10, 0xFEF 
Run Code Online (Sandbox Code Playgroud)

产生此错误(使用gcc编译时)

Error:  immediate out of range at operand 3 -- `AND X12, X10, 0xFEF'
Run Code Online (Sandbox Code Playgroud)

有趣的是,这行汇编代码编译得很好:

ADD X12, X10, 0xFEF
Run Code Online (Sandbox Code Playgroud)

我正在使用aarch64-linux-gnu-gcc(Linaro GCC 2014.11)4.9.3(预发布)

assembly gcc arm64

3
推荐指数
2
解决办法
3442
查看次数

在Java 8中应用一系列过滤器是否有优雅的方法?

有没有办法使用reduce或类似的方法将一组过滤器应用于对象数组?

现在,我有这个:

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
    LongStream stream = Arrays.stream(initialData);
    for (LongPredicate filter : filters) {
      stream = stream.filter(filter);
    }
    long[] dataToUse = stream.toArray();

    // Use filtered data
}
Run Code Online (Sandbox Code Playgroud)

更优雅的解决方案看起来像这样:

private void applyManyFilters(long[] initialData, LongPredicate... filters) {
    long[] dataToUse = Arrays.stream(filters).reduce(Arrays.stream(initialData), (a, b) -> a.filter(b)).toArray();

    // Use filtered data here
}
Run Code Online (Sandbox Code Playgroud)

当然,上面的例子不能编译,因为两个参数都reduce需要,而LongPredicate不是LongStream.我很好奇上面的代码是否可以写成一行?

(PS为了清楚起见,这是一个关于Java 8如何工作的问题,而不是关于样式的问题.我同意单行方法几乎不像循环一样可读.)

java reduce lambda java-8 java-stream

3
推荐指数
2
解决办法
244
查看次数

有没有一种方法可以在gnu汇编常量中使用数学表达式?

执行以下操作的正确gnu汇编语法是什么:

.section .data2
.asciz "******* Output Data ********"
total_sectors_written:   .word 0x0
max_buffer_sectors: .word ((0x9fc00 - $data_buffer) / 512)  # <=== need help here
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"
Run Code Online (Sandbox Code Playgroud)

具体来说,我正在编写一个玩具OS。上面的代码是16位实模式。我正在设置一个数据缓冲区,该缓冲区将转储回启动磁盘。我想计算之间的扇区数data_buffer放置在内存中的位置与该数据缓冲区的上限。(地址0x9fc00是缓冲区将运行到保留用于其他目的的RAM的位置。)

我知道我可以编写汇编代码来计算这个;但是,由于它是在构建时就知道的常数,所以我很好奇能否让汇编器为我计算它。

我遇到了三个具体问题:

(1)如果我使用$data_buffer此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: can't resolve `L0' {*ABS* section} - `$data_buffer' {*UND* section}
Run Code Online (Sandbox Code Playgroud)

我会感到困惑,因为$当我想要标签的内存地址时,应该使用它,对吗?

(2)如果我使用data_buffer而不是$data_buffer,则会出现此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: value of 653855 too …
Run Code Online (Sandbox Code Playgroud)

assembly gcc gnu-assembler osdev x86-16

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

C++所有模板实例的单一函数指针

有没有简洁的方法指向模板化函数的所有实例而不使用宏?

我有几个模板化的函数,我想测试各种类型:

template<typename T>
void function1() {
  return;
}

template<typename T>
void function2() {
  return;
}

template<typename T>
void function3() {
  return;
}
Run Code Online (Sandbox Code Playgroud)

我可以用宏来做到这一点:

#define TEST_ACROSS_TYPES(fn) \
fn<int>();  \
fn<bool>(); \
fn<char>(); \
fn<double>(); \

TEST_ACROSS_TYPES(function1);
TEST_ACROSS_TYPES(function2);
Run Code Online (Sandbox Code Playgroud)

但是,(1)宏是丑陋的,很难让其他人遵循,(2)我正在使用CATCH,当使用宏来设置测试用例时这并不好用.

有没有办法做这样的事情:

void testAcrossTypes(SomeType f) {
  f<int> ();
  f<bool> ();
  f<char> ();
  f<double> ();
}
Run Code Online (Sandbox Code Playgroud)

除了定义问题外,它看起来更清晰SomeType.这个问题(如何定义具有模板参数的函数指针的typedef)解释了如何定义指向模板化函数的指针; 但是,要求指定模板参数.


为了澄清:想象一下function1,function2function3每测试一个不同的模板函数.每个功能需求进行测试int,byte,char,double,等我想避免明确设置了许多(即num_functions*num_types)每个功能测试.相反,我想有一个指向测试功能(一个单一的方法function1,function2等),并运行它为每个模板类型,从而巩固

function1<int>(); …
Run Code Online (Sandbox Code Playgroud)

c++ macros templates function-pointers

2
推荐指数
1
解决办法
164
查看次数

是否可以在C++中"捆绑"模板参数?

有没有办法将模板参数"捆绑"在一起以避免重复?

我有几个类和函数都使用相同的三个模板参数.拥有一次使用每个类/函数的函数并不罕见.结果代码非常快速地变得非常混乱.是否有更简洁的方法来编写此代码?

// ContextFactory is a pointer to functions that instantiate objects that are subtypes of MetricContext
template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
using ContextFactory = MetricContext <VertexID, EdgeMembershipType, SetBitmap> *(*)(const char *);

template<typename VertexID, typename EdgeMembershipType, typename SetBitmap>
    static vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> buildCFList() {
      vector<ContextFactory<VertexID, EdgeMembershipType, SetBitmap>> answer;
      answer.push_back(MetricContext<VertexID, EdgeMembershipType, SetBitmap>::template make<NeoContext<VertexID, EdgeMembershipType, SetBitmap >>);
      return answer;
    };
Run Code Online (Sandbox Code Playgroud)

请注意,此函数的近一半是字符串的重复<VertexID, EdgeMembershipType, SetBitmap>>,但每次使用此字符串都适用于不同的类或函数,因此我认为别名不起作用.

(如果它有帮助,这个函数的目的是创建一个指向函数的指针数组,这些函数将创建作为子类型的子对象的对象 MetricContext<VertexID, EdgeMembershipType, SetBitmap>>

c++ templates using-declaration c++11

2
推荐指数
1
解决办法
154
查看次数

这种比较是否不一致(或者还有其他问题)?

下面的代码在我的 mac 上出现段错误;但是,在 Linux 上工作正常(甚至没有 valgrind 错误)。

我怀疑比较函数给出了不一致的结果;但是,我看不到如何。

(我有一种感觉,当有人指出时,我会觉得自己很愚蠢:)

上下文:这是学生的代码。我知道有更好的编码方法,我只是不知道为什么它是错误的。

using namespace std;

using Point = std::pair<double, double>;
using PointVector = vector<Point>;
extern PointVector cluster1;

bool sortComparison(const Point &point1, const Point &point2) {

  if(point1.first < point2.first)
    return true;
  else if(point1.first > point2.first)
    return false;
  else if(point1.second < point2.second)
    return true;
  else if(point1.second > point2.second)
    return false;
  else
    return true;
}


int main(int argc, char *argv[]) {

  cout << "In" << endl;
  std::sort(cluster1.begin(), cluster1.end(), sortComparison);
  cout << "Out" << endl;

}
Run Code Online (Sandbox Code Playgroud)

c++ sorting iterator comparator

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

"实时计算"是否适用于可变?

图形可以表示为邻接矩阵或邻接列表.我的Graph对象将图形表示为邻接矩阵.出于性能原因,除非有要求,否则我不会计算邻接表; 但是,一旦提出要求,我想保留清单(以避免重新建立).

是否适合制作邻接列表mutable,以便用户可以为其他const Graph对象生成邻接列表?我问,因为我不相信构建邻接矩阵会被视为"物理"而不是"逻辑"改变状态Graph.我也有一个adjacencyListBuilt方法,因此邻接列表的构建不是"不可见的"(参见https://isocpp.org/wiki/faq/const-correctness#mutable-data-members).

如果我理解正确,声明adjacencyList实例变量mutable将允许任何方法更新它.有没有办法只有buildAdjacencyList方法能够修改对象adjacencyList上的实例变量const

c++ const-correctness mutable

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