Tag: C#的

自动属性和结构不要混合?

在回答这个post的时候 ,围绕着一些小的结构,我偶然发现了以下情况: 以下结构使用int字段是完全合法的: struct MyStruct { public MyStruct ( int size ) { this.Size = size; // <– Legal assignment. } public int Size; } 但是,使用自动属性的以下结构不能编译: struct MyStruct { public MyStruct ( int size ) { this.Size = size; // <– Compile-Time Error! } public int Size{get; set;} } 返回的错误是“这个对象不能在所有的字段被赋值之前使用”。 我知道这是一个结构的标准过程:任何属性的后台字段必须从结构的构造函数中直接分配(而不是通过属性的set访问器)。 解决scheme是使用明确的后台字段: struct MyStruct { […]

如何在C ++中遍历一个充满string的STL映射

我有以下问题相关迭代使用std :: map定义的string的关联数组。 — snip — class something { //… private: std::map<std::string, std::string> table; //… } 在构造函数中,我使用与string数据关联的string键来填充表。 在其他地方,我有一个toString方法,它返回一个string对象,该对象包含表格对象中包含的所有关键字和关联数据(如key =数据格式)。 std::string something::toString() { std::map<std::string, std::string>::iterator iter; std::string* strToReturn = new std::string(""); for (iter = table.begin(); iter != table.end(); iter++) { strToReturn->append(iter->first()); strToReturn->append('='); strToRetunr->append(iter->second()); //…. } //… } 当我试图编译时,我得到以下内容 错误:“错误:调用不匹配”(std :: basic_string,std :: allocator>)()'“。 有人可以向我解释什么是错过的,我做错了什么? 在hash_map的情况下,我只find了一些有关类似问题的讨论,其中用户必须定义​​一个哈希函数来使用hash_map和std :: […]

C vs C ++结构alignment

在最近的一次关于C ++结构体字段alignment的问题上,我被问到了这个问题,并且理论上C和C ++在结构打包中遵循相同的策略。 Hovewer,这是错误的假设。 面试官说,总的来说,C和C ++以不同的方式打包,我们不应该期待相反的结果。 恕我直言,这是奇怪的声明。 C ++中没有用于双C / C ++头文件的pack "C"限定符。 所以实际上,这可能意味着你不能在C ++中创build一个结构体,并把它传递给一个C库,因为通常它的字段将以不同的方式alignment,并且具有不同的偏移量。 但事实上,大多数程序员认真地依赖于这种互操作性,直到他们将一个指针转换为一个C POD结构为止,以及一些辅助方法引用C ++包装。 你能澄清这个问题吗?

我应该从使用boost :: shared_ptr切换到std :: shared_ptr?

我想用-std=c++0x在GCC中启用对C ++ 0x的支持。 我并不一定需要GCC 4.5(和4.6版本)中目前支持的C ++ 11特性 ,但我想开始习惯它们。 例如,在我使用迭代器的一些地方, autotypes会很有用。 但是,我不需要任何当前支持的function。 这里的目标是鼓励我将新标准的特征融入到我的编程“词汇”中。 从你所了解的C ++ 11的支持中,在GCC中启用它是一个好主意,然后通过例如从使用boost::shared_ptr到std::shared_ptr ,混合? PS:我知道这个比较不同风格的shared_ptr 好问题 ,但是我要求在标准最终确定之前就要使用哪个更高层次的build议。 另外一种方法是,像GCC这样的编译器说它支持“实验性function”,这是否意味着在编译期间我可能会遇到奇怪的错误,这将是主要的时间和StackOverflow的隐藏问题的来源? 编辑 :我决定从std::shared_ptr切换回来,因为我不相信它在GCC 4.5中的支持, 如在这个问题中的示例所示 。

为什么C ++优化器对这些临时variables有问题,或者为什么在紧密循环中应该避免使用v `?

在这个代码片段中 ,我比较了两个function相同的循环的性能: for (int i = 1; i < v.size()-1; ++i) { int a = v[i-1]; int b = v[i]; int c = v[i+1]; if (a < b && b < c) ++n; } 和 for (int i = 1; i < v.size()-1; ++i) if (v[i-1] < v[i] && v[i] < v[i+1]) ++n; 第一个运行速度明显慢于第二个,其优化标志设置为O2 : […]

void_t“可以实现概念”?

我正在观看Walter Brown的CppCon2014谈话模板元编程的第二部分,在此期间他讨论了他的小说void_t<>构造的void_t<> 。 在他的演讲中,彼得·索莫拉德问他一个我不太明白的问题。 (链接直接回答问题,正在讨论的代码直接发生在那之前) Sommerlad问道 沃尔特,这是否意味着我们现在可以实现概念lite? 沃尔特回应 哦耶! 我已经完成了…它没有完全相同的语法。 我理解这个交stream是关于概念精简版。 这种模式真的是多才多艺的? 不pipe出于什么原因,我都没有看到它。 有人可以解释(或草图)这样的事情吗? 这仅仅是关于enable_if和定义特征,或者提问者提到的是什么? void_t模板定义如下: template<class …> using void_t = void; 然后他使用它来检测types语句是否格式正确,使用它来实现is_copy_assignabletypes特征: //helper type template<class T> using copy_assignment_t = decltype(declval<T&>() = declval<T const&>()); //base case template template<class T, class=void> struct is_copy_assignable : std::false_type {}; //SFINAE version only for types where copy_assignment_t<T> is well-formed. template<class […]

使用返回随机结果的函数进行unit testing

我不认为这是特定于一种语言或框架,但我使用xUnit.net和C#。 我有一个函数,返回一定范围内的随机date。 我通过一个date,返回date总是在给定date之前的1到40年的范围内。 现在我只是想知道是否有一个很好的方法来unit testing。 最好的方法似乎是创build一个循环,并让该函数运行100次,并断言这100个结果中的每一个都在期望的范围内,这是我目前的方法。 我也意识到,除非我能够控制我的随机生成器,否则将不会有一个完美的解决scheme(毕竟,结果是随机的),但我不知道当你必须testing返回随机结果的function一定范围?

我如何决定是否将ATL,MFC,Win32或CLR用于新的C ++项目?

我刚刚开始我的第一个C ++项目。 我正在使用Visual Studio 2008 。 这是一个单一窗体的Windows应用程序,用于访问几个数据库并启动WebSphere MQ事务。 我基本上理解ATL,MFC,Win32(我实际上对此有点朦胧)和CLR之间的区别,但是我对如何select我却不知所措。 是否有一个或多个这些为了向后兼容? CLR 是一个坏主意吗? 任何build议感激。 编辑:我已经selectC ++这个项目,因为我没有在post中进入,这不完全是技术性的。 所以, 假设 C ++是唯一的/最好的select,我应该select哪一个?

析构函数与IDisposable?

我已经阅读了在C#中处理对象/ IDisposable接口和析构函数,但对我来说,他们似乎做同样的事情? 两者有什么区别? 为什么我会用另一个呢? 事实上,在这个例子中(下面的链接),这段代码使用了IDisposable接口和一个析构函数: http://msdn.microsoft.com/en-us/library/system.idisposable.aspx 评论说,析构函数是如果没有使用终结代码,但我该如何决定何时使用一个?

循环无锁缓冲区

我正在devise一个连接到一个或多个数据馈送stream的系统,并对数据进行一些分析,而不是基于结果触发事件。 在典型的multithreading生产者/消费者设置中,我将有多个生产者线程将数据放入一个队列,多个消费者线程读取数据,而消费者只对最新的数据点加上n个点感兴趣。 生产者线程将不得不阻止,如果缓慢的消费者无法跟上,当然消费者线程将阻止时,没有未经处理的更新。 使用读/写锁的典型并发队列可以很好地工作,但数据传入的速度可能很大,所以我想减less我的locking开销,尤其是制作者的locking锁。 我认为我需要一个循环的无锁缓冲区。 现在有两个问题: 循环锁无缓冲区的答案? 如果是这样,在我推出自己的之前,你知道任何符合我需要的公共实现吗? 任何实现循环无锁缓冲区的指针总是受欢迎的。 顺便说一句,在Linux上使用C ++来完成。 一些额外的信息: 响应时间对我的系统至关重要。 理想情况下,消费者线程将希望看到任何更新尽快进入,因为额外的1毫秒的延迟可能会使系统变得毫无价值,或价值更低。 我所倾向的devise思路是一个半无锁的循环缓冲区,其中生产者线程尽可能快地将数据放入缓冲区,让我们调用缓冲区A的头部,不阻塞,除非缓冲区满了, A满足缓冲区Z的结束。消费者线程将分别持有指向循环缓冲区P和P n的两个指针,其中P是线程的本地缓冲区头,P n是P之后的第n个项目。每个消费者线程将前进它的P和P n一旦完成处理当前的P,缓冲区指针Z的结束以最慢的P n前进。 当P赶上A,这意味着没有更多的新的更新处理,消费者旋转,并忙着等待A再次前进。 如果消费者线程旋转太久,它可以进入睡眠状态,并等待一个条件variables,但我可以消费者占用CPU周期等待更新,因为这不会增加我的延迟(我会有更多的CPU核心比线程)。 想象一下,你有一个循环轨道,生产者在一群消费者面前运行,关键是调整系统,使生产者通常跑在消费者的前面几步,这些操作大部分可以使用无锁技术完成。 我明白,要获得执行权的细节并不容易……好吧,非常辛苦,这就是为什么我想在从自己的angular度去学习别人的错误之前。