前向,双向和随机访问类别的迭代器需要是默认构造的.
为什么这样,为什么输入和输出运算符不必是默认可构造的?
我们的软件抽象出硬件,我们有代表这个硬件状态的类,并且有很多数据成员用于该外部硬件的所有属性.我们需要定期更新有关该状态的其他组件,为此我们通过MQTT和其他消息传递协议发送protobuf编码的消息.有不同的消息描述硬件的不同方面,因此我们需要发送这些类的数据的不同视图.这是一个草图:
struct some_data {
Foo foo;
Bar bar;
Baz baz;
Fbr fbr;
// ...
};
Run Code Online (Sandbox Code Playgroud)
让我们假设我们需要发送一条包含foo
和的消息bar
,并且一封包含bar
和baz
.我们目前的做法是大量的锅炉板:
struct foobar {
Foo foo;
Bar bar;
foobar(const Foo& foo, const Bar& bar) : foo(foo), bar(bar) {}
bool operator==(const foobar& rhs) const {return foo == rhs.foo && bar == rhs.bar;}
bool operator!=(const foobar& rhs) const {return !operator==(*this,rhs);}
};
struct barbaz {
Bar bar;
Baz baz;
foobar(const Bar& bar, const Baz& baz) : bar(bar), baz(baz) {}
bool …
Run Code Online (Sandbox Code Playgroud) 是否由标准指定的C++程序的编译阶段?
如果是这样,他们是什么?
如果没有,广泛使用的编译器(我更喜欢MSVS)的答案会很棒.
我在谈论预处理,标记化,解析等.它们的执行顺序是什么,特别是它们的作用是什么?
编辑:我知道编译,链接和预处理是做什么的,我最感兴趣的是其他人和订单.当然,对这些的解释也受到欢迎,因为我可能不是唯一对答案感兴趣的人.
在C#中,您可以使控制台等待输入字符(这对于在程序退出之前能够看到控制台的最后输出非常有用).作为C++的初学者,我不确定它的等价物是什么.有吗?
有人可以简单地向我解释Visual Studio的解决方案文件(.sln)和项目文件(.vcproj)之间的区别.
在我看来,在Visual Studio中打开正确的解决方案/项目.是另一个的超级集吗?
注意:我目前正在使用Visual Studio 2008处理从Visual Studio 2005提出的项目(我相信).
我知道在C++ 98中,既不需要std::basic_string<>
也不std::vector<>
需要使用连续存储.std::vector<>
一旦被指出,这被视为疏忽,如果我没记错的话,用C++ 03修复.
我似乎记得std::basic_string<>
在C++ 11仍然被称为C++ 0x时读过有关需要使用连续存储的讨论,但我当时没有密切关注讨论,并且仍然局限于C++ 03的工作所以我不确定它是什么.
那么是否std::basic_string<>
需要使用连续存储?(如果是这样,那么标准的哪个版本首先需要它?)
如果您想知道:如果您将代码传递&str[0]
给期望连续写入内存的函数,则这很重要.(我知道str.data()
,但由于显而易见的原因,旧代码不使用它.)
我有一个std::string
可能是一个字符串或可能是一个值(如0
).
转换std::string
为int
具有失败能力的最佳或最简单的方法是什么?我想要C#的C++版本Int32.TryParse
.
如果我尝试以下内容:
int anint;
char achar;
printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);
Run Code Online (Sandbox Code Playgroud)
它允许输入一个整数,然后scanf
完全跳过第二个,这真的很奇怪,因为当我交换两个(char
scanf优先)时,它工作正常.究竟是什么错了?
我正在扩展现有的日志记录库.它是一个有两面的系统:前端是任务将日志消息写入的位置,后端是应用程序可以插入侦听器的位置,将这些消息转发到不同的接收器.后端曾经是一个硬连线的监听器,我现在正在扩展这个灵活性.该代码专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标.
出于性能原因,消息被缓冲,并且转发在后台任务中完成.该任务从队列中提取一大块消息,将它们全部格式化,然后通过已注册的函数将它们传递给侦听器.这些侦听器将过滤消息,并且只会将这些消息写入通过过滤条件的接收器.
鉴于此,我最终得到了N
发送M
消息的通知函数(侦听器),这是一个相当经典的N*M
问题.现在我有两种可能性:我可以遍历消息,然后循环通过将消息传递给每个消息的通知函数.
for(m in formatted_messages)
for(n in notification_functions)
n(m);
void n(message)
{
if( filter(message) )
write(message);
}
Run Code Online (Sandbox Code Playgroud)
或者我可以循环遍历所有通知函数,并将它们立即传递给我:
for(n in notification_functions)
n(formatted_messages);
void n(messages)
{
for(m in messages)
if( filter(m) )
write(m);
}
Run Code Online (Sandbox Code Playgroud)
关于哪种设计更有可能允许每个时间片处理更多数量的消息,是否有任何基本考虑因素?(注意这个问题如何决定听众的界面.这不是一个微优化问题,而是一个关于如何使设计不妨碍性能的问题.我只能在很长一段时间后进行测量,然后重新设计监听器接口将会很昂贵.)
我已经做了一些考虑:
c++ ×8
c++-faq ×2
console ×2
stl ×2
boilerplate ×1
c ×1
c++11 ×1
c++14 ×1
c++17 ×1
compilation ×1
containers ×1
iterator ×1
loops ×1
parsing ×1
performance ×1
redundancy ×1
scanf ×1
stdtuple ×1
windows ×1