小编Som*_*ame的帖子

枚举类的运算符的实现

在讨论了"枚举类"的增量和减量之后,我想问一下enum class类型的算术运算符的可能实现.

原始问题的示例:

enum class Colors { Black, Blue, White, END_OF_LIST };

// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
  c = static_cast<Colors>( static_cast<int>(c) + 1 );
  if ( c == Colors::END_OF_LIST )
    c = Colors::Black;
  return c;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现算术运算符而不转换为已定义运算符的类型?我想不出任何东西,但是铸造困扰着我.演员通常表示出现了错误,并且必须有充分的理由让他们使用.我希望语言允许在不强制使用特定类型的情况下实现运算符.

2018年12月更新:其中一篇关于C++ 17的论文似乎至少部分地通过允许枚举类变量和基础类型之间的转换来解决这个问题:http://www.open-std.org/jtc1/sc22/wg21/文档/文件/ 2016/p0138r2.pdf

c++ operator-overloading c++11 enum-class

32
推荐指数
2
解决办法
6万
查看次数

为什么C不能旋转左/右操作符?

我想,这是一个哲学问题.

C语言有一组标准的逐位运算的,其中包括OR,AND,XOR,SHIFT LEFT/RIGHT,和NOT.为什么不旋转左/右旋转操作符或语言中包含的函数?

这些运算符与其他逐位运算符具有相同的复杂性,并且通常需要单个汇编指令,就像其他运算符一样.此外,我可以想到旋转运算符的很多用途,可能不会比xor运算符少 - 所以对我来说听起来有些奇怪,它们不包括在C中.

如果您确实需要使用C或C++进行旋转,那么有关于它的最佳实践的单独常见问题解答.关于这个问题的讨论是偏离主题的.

c bitwise-operators

13
推荐指数
2
解决办法
9679
查看次数

VS 2012中的Variadic模板(Visual C++ 2012年11月CTP)

我安装了Visual C++编译器2012年11月CTP并创建了一个C++控制台项目.我写了这个

template<typename T>
void Test(T value){
}
template<typename T, typename... Args>
void Test(T value, Args... args){
    Test(value);
    Test(args...);
}

int main(){
    Test(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)

然后我按下F6来构建IDE.我在第4行得到了这个错误

error C2143: syntax error : missing ',' before '...'
Run Code Online (Sandbox Code Playgroud)

编译列表"可变参数模板",所以我认为这应该工作.我知道intellisense可能是不正确的,但'编译器'应该工作.我可以不用IDE构建吗?我必须在某个地方启用某些东西吗?int i{4};似乎也没有工作,我相信这是有效的统一初始化.

c++ visual-c++ c++11 visual-c++-2012

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

使用Enum-value而不使用Enum-classname

我在接口中使用静态枚举,并希望在扩展类中使用它.

我有以下接口:

public interface StateSupport {
    public static enum State {
        NEW,
        UNCHANGED,
        UPDATED;
    }
}
Run Code Online (Sandbox Code Playgroud)

public interface Support extends StateSupport  {
    public void do(Context arg0);
}
Run Code Online (Sandbox Code Playgroud)

最后是一堂课

public class MyClassUtil implements Support {
    public void do(Context arg0){ 
        MyClass obj = new MyClass(NEW);
    }
Run Code Online (Sandbox Code Playgroud)

}

关键是我不想写"State.NEW",只是"新":-)

那么如何在不使用枚举名称的情况下做到这一点.有办法吗?

java inheritance enums class

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

如何为Windows实现USB设备驱动程序?

我应该如何为Windows实现USB设备驱动程序?我应该如何考虑不同版本的Windows,例如: - Windows XP - Windows Vista - Windows 7

是否有可以作为起点的开源解决方案?我是Windows驱动程序开发的新手.

我们有一个带USB设备端口的嵌入式设备,我们希望在不牺牲数据吞吐量的情况下,尽可能实现从应用程序级到设备的低延迟通信.传输的实际数据是ADC/DAC数据.基本上我们需要尽快将大量数据传输到Windows机器上.

c windows embedded driver

11
推荐指数
2
解决办法
6266
查看次数

C++如何从具有不同返回类型的接口继承多个?

也许我有两个具有相同功能名称和参数的接口,但具有不同的返回值:

struct A { virtual void foo() = 0; };
struct B { virtual int foo() = 0; };
Run Code Online (Sandbox Code Playgroud)

如何定义继承此接口的类C(如果可能的话)?例如,我写了一些未编译的伪代码:

// this code is fake, it doesn't compiled!!
struct C : A, B
{
    // how to tell compiler what method using if referenced from C?
    using void foo();  // incorrect in VS 2012
    // and override A::foo() and B::foo()?
    virtual void foo() { std::cout << "void C::foo();\n"; } // incorrect
    virtual int foo() { std::cout << "int C::foo();\n"; return …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance visual-studio-2012

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

将代码移动到内核空间会给出更精确的时序吗?

背景资料:

我目前有一个连接USB端口的硬件设备.硬件设备负责将精确的周期性消息发送到各种网络上,而这些网络又连接起来.在硬件设备内部,我有两个Microchip dsPIC.有两种操作模式.

一种情况是将简单的"作业"发送到dsPIC,然后可以发送精确到0.001厘米的精确消息.这种架构不适用于更复杂的消息传递,我们需要根据PC应用程序中发生的事件发送周期性数据包.所以我们有第二种操作模式,我们的PC应用程序将发送周期性消息,而dsPIC只是简单地转换和发送.顺便说一下,所有这些对我们软件的最终用户来说都是透明的.我们的硬件设备是汽车领域中使用的测试工具.

目前,我们使用FTDI的USB转串口芯片和FTDI Windows驱动程序将硬件连接到我们的PC软件.

问题在于,在我们从PC发送消息的模式二中,我们能够实现的最佳平均硬件范围约为1ms.我们受到Windows内核抢占.我已经尝试了一些"技巧"来改进诸如:

  1. 确保我们的读写器线程在可能的情况下依赖于单独的CPU关联.
  2. 增加编写器的线程优先级,同时减少读者的线程优先级.
  3. 使用我们的软件时,通知用户关闭屏幕保护程序和其他应用程序.
  4. 使用CreateTimerQueueTimer调用替换createthread调用.

我们所有的软件都是用C/C++编写的.我对高级Windows编程非常熟悉和熟悉; 例如IO Completions,Overlapped I/O,无锁线程队列(实际上是一种设计策略),套接字,线程,信号量等等......

但是,我对Windows驱动程序开发一无所知.我已经阅读了几篇关于KMDF与UDMF和WDM的论文.

我希望经验丰富的Windows内核模式驱动程序开发人员会在这里回复...

下一轮.我们的硬件可以选择更换FTDI芯片并使用dsPIC的USB接口,或者可能将开源Linux FTDI内容移植到Windows,并继续在我们的自定义驱动程序中使用FTDI芯片.我认为通过在PC端访问内核模式驱动程序,我可以建立一个内核驱动程序,可以更精确的间隔发送周期性消息,而无需抢占和/或可能利用DMA.

我们在我们的业务中有一个竞争对手,我认为它与他们的工具完全相似.据我所知,用户空间应用程序无法安排任何优于1ms的线程.我们目前在一个线程中使用timeGetTime.我已经体验过计时器队列(通过CreateTimerQueueTimer)而没有真正的改进.

WDM是实现更精确计时的正确方法吗?

我们的竞争对手是如何实现从Windows驱动信号到硬件的非常精确的时序,并且它们确实加载内核驱动程序(.sys),并且它们的设备运行在USB2.0上,就像我们的一样.

如果WDM是可行的方法,我可以获得一些关于我应该研究什么内核函数来建立时间的建议吗?谢谢阅读

windows performance driver wdm

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

描述UML类图中的静态多态性

我有一个对象,根据构建配置在编译期间实例化.就所考虑的周围软件而言,该对象公开了相同的接口.我想模拟一个事实,即在编译期间(即static polymorphism)进行实例化决策,而不是通常的动态多态性.

有没有办法描述静态多态UML class diagram

这或多或少是我需要的:

在此输入图像描述

显然,在编译时只会实例化上述类型定义中的一个.

polymorphism uml class-diagram static-polymorphism

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

聚合多样性UML

我和我的同事无法就此达成共识。在UML中,进行聚合时,菱形面的最大折数是否为1,或者可以为0 .. *?还是取决于观点?
先感谢您 !

uml aggregation multiplicity

6
推荐指数
2
解决办法
7995
查看次数

学习COM值得吗?

我正在考虑学习COM.但我听说微软推出.NET作为COM的替代品.学习COM值得吗?实际上我开始学习UMDF设备驱动程序的COM.除了COM之外,还有其他方法可以在UMDF上工作吗?

.net com umdf

5
推荐指数
3
解决办法
708
查看次数