我正在一个使用几个Boost库的项目中。查看测试报告时,我们发现测试覆盖率信息有时确实适合我们的源代码。我能够将其追踪到boost :: range。我认为这是由于库中进行了一些静态初始化,尽管我无法说得更具体些。
基本上,如果您使用编译以下代码gcc --coverage,请运行,然后使用进行打印覆盖率报告gcov -b,那么将有四个其他分支和另一行,我想忽略它们。
#include <boost/range.hpp>
int foo(int x)
{
return x+1;
}
int main(int argc, char* argv[])
{
return foo(argc);
}
Run Code Online (Sandbox Code Playgroud)
覆盖率报告为:已执行的行:已执行5条分支的100.00%:已执行4条的100.00%至少被执行一次:已执行4条呼叫的50.00%已执行2条呼叫:已创建2条的100.00%创建'test_gcov.cpp.gcov'
我猜这5行的计数来自两个函数签名,函数主体和boost :: range库中的另一行。我不知道确切在哪里,但是生成的gcov文件显示正在进行一些静态初始化,所以我猜那是分支所在的位置。
我想知道是否有一种方法可以告诉gcov忽略boost名称空间中的任何代码,或任何其他方式。
今天,我尝试编写一个具有使用交集类型的泛型方法的类,并被根据相交类型的不同错误消息弄糊涂了。假设我们有 aninterface和 aclass并在泛型接口中定义泛型方法:
class ClassType {
}
interface InterfaceType {
}
interface I<T> {
public <X extends InterfaceType & InterfaceType> void foo();
public <X extends ClassType & ClassType> void foo1();
public <X extends ClassType & InterfaceType> void foo2();
public <X extends InterfaceType & ClassType> void foo3();
public <X extends T & ClassType> void foo4();
public <X extends ClassType & T> void foo5();
public <X extends InterfaceType & T> void foo6();
public <X extends T & InterfaceType> …Run Code Online (Sandbox Code Playgroud) 我正在编写一个表示时间序列数据的类,即基本上(Instant, T)是泛型类型的对映射T
interface TimeSeries<T> {
void add(Instant when, T data);
}
Run Code Online (Sandbox Code Playgroud)
我们处理的一些类实现了一个接口
interface TimeStamped {
Instant getTimeStamp();
}
Run Code Online (Sandbox Code Playgroud)
我想在TimeSeries界面中提供一个更方便的方法来添加这些数据项而不说明时间明确.基本上,我想要
interface TimeSeries<T> {
void add(Instant when, T data);
default <X extends T & TimeStamped> void add(X data) {
add(data.getTimeStamp(), data);
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不被语言所允许,因为我不能在交集类型中使用类型变量.是否存在不涉及放弃静态类型安全的解决方法?我能想到的唯一的事情是
interface TimeSeries<T> {
void add(Instant when, T data);
default void add(TimeStamped data) {
add(data.getTimeStamp(), (T)data);
}
default void add(TimeStamped t, T data) {
add(t.getTimeStamp(), data);
}
}
Run Code Online (Sandbox Code Playgroud)
add(TimeStamped t, T data) 是类型安全但仍然不方便.
我试图使用关联常量作为if-expression中的条件来初始化另一个常量.我认为这应该工作,因为我可以直接使用关联的常量初始化一些其他常量,因此它适用于const上下文并且if表达式不依赖于任何其他值.
trait C {
const c: i32;
}
trait StaticAssert<T1: C, T2: C> {
const canUseAssociatedConst: i32 = T1::c;
const canCompareAssociatedConst: bool = T1::c == T2::c;
const check: i32 = if T1::c == T2::c { 1 } else { 0 };
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我收到一个错误:
error[E0019]: constant contains unimplemented expression type
--> src/lib.rs:9:24
|
9 | const check: i32 = if T1::c == T2::c { 1 } else { 0 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我不确定编译器想告诉我什么.我添加了i32后缀以强制文字实际上是i32值,以防止分支中不同类型的任何问题,但这也没有帮助.
我决定实现一个使用几个标志的协议,所以我开始enum为标志定义s.然而,当我想定义有两个值可以是一个标志true或者false我得到一个错误信息:
// The protocol definition says that the flag
// can have two values true or false, so I could just use
// plain bool, but I want another name for true and false.
enum Flag {
ONE = true,
TWO = false,
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
--> src/lib.rs:5:11
|
5 | ONE = true,
| ^^^^ expected isize, found bool
error[E0308]: mismatched types
--> src/lib.rs:6:11
|
6 | TWO = false,
| ^^^^^ …Run Code Online (Sandbox Code Playgroud)