有没有一种简单的方法来检查单元测试中两个数组是否相等(即,具有相同数量的元素,并且每个元素是相同的?).
在Java中,我会使用assertArrayEquals (foo, bar);,但似乎没有C#的等价物.我试过Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));,但即使函数返回一个带有"a","b"的数组,检查仍然失败
这是使用Visual Studio 2008 Team Suite,内置单元测试框架.
我正在使用WPF开发应用程序,但有些组件是使用WinForms编写的.我不想这些组件从WPF部分拉出关键手势并将它们转换为Keys enum(在WinForms中使用).
是否有内置转换器?(可能不是)你知道"比大开关案例更容易"的方法吗?
我正在超载operator new,但我最近遇到了对齐的问题.基本上,我有一个类IBase,提供operator new和delete所有必要的变种.所有类都派生自IBase并因此也使用自定义分配器.
我现在面临的问题是我有一个孩子Foo必须是16字节对齐,而所有其他孩子在对齐到8字节时都很好.然而,我的内存分配器只在默认情况下与8字节边界对齐,所以现在代码IBase::operator new返回一个不可用的内存块.这应该如何正确解决?
我可以简单地强制所有分配为16个字节,这将正常工作,直到弹出一个32字节对齐的类型.弄清楚里面的对齐operator new似乎并不是微不足道的(我可以在那里进行虚函数调用以获得实际的对齐吗?)推荐的处理方法是什么?
我知道malloc应该返回一块适合所有内容的内存,不幸的是,这个"所有内容"不包含SSE类型,我真的很想让这个工作无需用户记住哪种类型有哪个对齐.
我最近一直在寻找Boost.Spirit(Boost 1.39中包含的版本),但是我对单独的文档很困惑.我正在寻找的是一个用Boost.Spirit实现的玩具语言的例子 - 一些微小的Javascript或Lua左右的东西,你基本上创建一个AST和进程.如果它只支持函数/变量定义和基本运算符,我会很高兴,我只想看看如何使用Boost.Spirit创建一个普通的AST,以及如何实现标识符,声明等基本规则.
到目前为止,我已经尝试过计算器示例,但我不清楚如何使用Spirit实现更大的语法.另一方面捆绑的mini_c示例看起来已经非常复杂了,并且记录得不是很好.是否有一些易于理解的Boost.Spirit指南,或者可能是一本书?
如何跟踪C++中的内存分配,尤其是new/ delete.对于一个对象,我可以轻松覆盖operator new,但我不确定如何全局覆盖所有分配,以便它们通过我的自定义new/ delete.这应该不是一个大问题,但我不确定应该怎么做(#define new MY_NEW?).
一旦这个工作,我会认为它足以在分配的指针/位置的某处有一个映射,所以我可以跟踪当前"活动"的所有分配,并且 - 在应用程序结束时 - 检查分配没有被释放的.
好吧,这似乎再次像肯定已经多次完成了几次,所以任何好的库(最好是便携式的)?
我有一个很好的接口,我想在基类中实现它的一个成员,因此客户端可以从基类派生,并且可以编写更少的样板.但是,即使声明为abstract,编译器也会抱怨该类没有实现接口?!?应该怎么做?
有问题的代码:
public interface ITaskDefinition
{
ITask CreateTask(TaskId id);
string Name { get; }
bool HasName { get; }
}
public abstract class TaskDefinitionBase : ITaskDefinition
{
private string name_ = null;
public void SetName(string name)
{
name_ = name;
}
public string Name
{
get
{
return name_;
}
}
public bool HasName
{
get
{
return name_ != null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ITaskDefinition.cs(15,27): error CS0535: 'NetWork.Task.TaskDefinitionBase' does not implement interface member 'NetWork.Task.ITaskDefinition.CreateTask(NetWork.Task.TaskId)'
Run Code Online (Sandbox Code Playgroud) 我在C#中有一个函数,我想将它(在其他一些东西中)移植到F#,只是为了做到这一点.不幸的是,我只是遇到了一个似乎没有办法在F#中表达这种情况的案例:拿这个C#函数
public static T Min<T>(params T[] p) where T : IComparable
{
T m1 = p[0];
foreach (T v in p)
{
m1 = (m1.CompareTo(v) < 0) ? m1 : v;
}
return m1;
}
Run Code Online (Sandbox Code Playgroud)
我认为这很容易,但我不明白如何在F#中指定变量参数列表.我试过这个:
let rec Min l =
match l with
| [] -> 0 // should throw exception here
| [v] -> v
| (h::t) -> min h (Min t)
Run Code Online (Sandbox Code Playgroud)
但是从C#调用它需要一个Microsoft.FSharp.Collections.List.有可能让它期待一个params T[],如果是这样,怎么样?
我正在转向GCC 4.6.1,它开始抱怨代码与GCC 4.4和MSVC10一起工作正常.它似乎不想在从这样的函数返回之间shared_ptr和之间进行转换bool:
class Class { shared_ptr<Somewhere> pointer_; };
bool Class::Function () const
{
return pointer_;
}
Run Code Online (Sandbox Code Playgroud)
运用
return static_cast<bool> (pointer_);
Run Code Online (Sandbox Code Playgroud)
一切正常.到底他妈发生了什么?这是--std=cpp0x.
只是想知道:当我向指针添加restrict时,我告诉编译器指针不是另一个指针的别名.我们假设我有一个类似的函数:
// Constructed example
void foo (float* result, const float* a, const float* b, const size_t size)
{
for (size_t i = 0; i < size; ++i)
{
result [i] = a [0] * b [i];
}
}
Run Code Online (Sandbox Code Playgroud)
如果编译器必须假设result可能重叠a,则必须每次重新获取.但是,正如a标记的那样const,编译器也可以假设a是固定的,因此一次取回它就可以了.
问题是,在这种情况下,使用restrict的推荐方法是什么?我当然不希望编译器a每次都重新获取,但我找不到关于如何restrict在这里工作的好信息.
如何允许STL实现获取我的自定义类型?在MSVC上,有一个类std::tr1::hash,我可以通过使用来部分专门化
namespace std
{
namespace tr1
{
template <>
struct hash<MyType>
{ ... };
}
}
Run Code Online (Sandbox Code Playgroud)
但这是推荐的方式吗?此外,这是否也适用于GCC的实施?因为boost::hash,它足以提供免费功能size_t hash_value (const MyType&),是否有类似的TR1实现?
c++ ×6
c# ×3
.net ×1
boost-spirit ×1
c ×1
c++11 ×1
debugging ×1
f# ×1
gcc ×1
inheritance ×1
new-operator ×1
optimization ×1
tr1 ×1
unit-testing ×1
wpf ×1