C++ Primer(第5版)通过将一个inserter或move iterator一个常规迭代器传递给一个std通用算法,给出了一些实现好效果的例子.
但是,我怀疑能够做到这一点取决于算法工作的内部知识,即它对迭代器参数的确切作用.这更加严重move inserter,因为我们需要确保在移动对象后不会访问它.
我的怀疑是否合理?如果是,那么标准库如何采用一种方法,要求客户(我)知道提供者的内部(STL)?
该方式static_assert是在Loki库中实现的(它实际上是一个名为 的预处理器宏),它可以按如下方式使用:STATIC_CHECK
STATIC_CHECK(myCondition, My_Error_Message);
Run Code Online (Sandbox Code Playgroud)
请注意,My_Error_Message必须是有效的标识符。
我想知道标准是如何static_assert实现为C++11错误消息采用字符串文字参数的。
我决定查看type_traits包含文件,该文件位于/usr/include/c++/4.8我的 Ubuntu 14.04 和 g++ 4.8.2 中。令我惊讶的是,我只找到了static_assert那里的用法,而不是定义(也不是预处理器宏)。我没有在其中包含的文件中找到它type_traits。
那么,我在哪里寻找static_assert?
我刚刚在第298页的C++ Primer(第5版)中阅读了以下定义:
在以下情况下,类是聚合:
它的所有数据成员都是公开的
它没有定义任何构造函数
它没有类内初始化器
它没有基类或虚函数
本文还提供了一个定义:什么是聚合和POD以及它们如何/为何特殊?.
毕竟我在本书的前几节中读到了封装的价值,我想知道:为什么有人想要使用聚合类?(顺便说一句,这个问题似乎适用struct于一般情况:我为什么要public:默认拥有?)
假设以下声明:
template <typename T> struct MyTemplate;
Run Code Online (Sandbox Code Playgroud)
以下部分特化的定义似乎使用相同的字母T来表示不同的类型.
template <typename T> struct MyTemplate<T*> {};
Run Code Online (Sandbox Code Playgroud)
例如,让我们进行具体的实例化:
MyTemplate<int *> c;
Run Code Online (Sandbox Code Playgroud)
现在,再次考虑上面部分特化的定义:
template <typename T> struct MyTemplate<T*> {};
Run Code Online (Sandbox Code Playgroud)
在这一行的第一部分(即template <typename T>),T是int *.在线的第二部分(即MyTemplate<T*>),T是int!
那么,部分专业化的定义如何读取?
我运行的程序中的一些目标Makefile,其输出(它们发送到stdout)是我感兴趣的。由于我不知道的原因, 的作者make决定将执行的命令回显到stdout,这会污染后者。
这里建议了一种解决此问题的硬方法,其中涉及交换文件描述符。我想知道是否有一种更简单的方法来强制makeecho 到stderr.
我浏览了man的页面make,但除了选项之外没有找到任何与此目的相关的内容-s。我更喜欢保留命令的回显,但将其放在stderr.
我还尝试创建一个辅助目标(我将其作为所有其他目标的先决条件),我在其中放置了:
exec 3>&2
exec 2>&1
exec 1>&3
Run Code Online (Sandbox Code Playgroud)
但 bash 抱怨 3 不是有效的文件描述符。我只是尝试过exec 1>&2,但没有任何效果......
假设我们有一个包含几个策略类的名称空间:
namespace loggingPolicy {
class OnWrite {...};
class OnReadWrite {...};
etc.
} // namespace
Run Code Online (Sandbox Code Playgroud)
这个名字LoggingPolicy::OnWrite很有意义。另一方面,此名称空间实际上是类的集合,而名称loggingPolicies将更好地反映这一点。应该选择哪一个?
尽管我通常不遵循《 Google C ++样式指南》,但确实查找了名称空间的命名约定,但是在此问题上没有任何话要说。
PS:我正在从事一个独立项目,并且不受任何组织准则的约束。但是,我的框架有望被许多人使用,因此好的书写方式很重要。
考虑:
int total = 14; // something for which double does not make sense
int nPeople = 5;
double perCapita = static_cast<double>(total) / nPeople; // should this cast be avoided?
Run Code Online (Sandbox Code Playgroud)
在这种情况下应该避免铸造吗?是写好1.0 * total / nPeople还是别的好?
考虑以下使用动态分配的二维数组的方式(由于某种原因,这里的回复中没有出现这种方式):
const int nRows = 2, nCols = 3;
int (*arr)[nCols] = (int(*)[nCols])(new int[nRows * nCols]);
arr[1][1] = 2;
std::cout << arr[1][1] << endl;
delete[] arr;
Run Code Online (Sandbox Code Playgroud)
delete[]在这种情况下,最后一行是否正确释放了内存?
我想按照文档中的描述水平排列 PayPal 和信用卡按钮。当我垂直堆叠它们时,两个按钮都显示得很好。但是,信用按钮不会在水平布局中显示......
<PayPalButtons
style={{
layout: 'horizontal',
color: 'silver',
shape: 'pill',
label: 'pay',
tagline: false,
height: 30}}
createOrder={(data, actions) =>
{return onCreate(data, actions);}}
onCancel={() => onCancel()}
onError={(err) => onError()}
onApprove={(data, actions) => onSuccess(data, actions)}
/>
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我刚刚在《C++ Primer (第五版)》第 563 页上了解到,可以重载赋值运算符。因此,如果我正在编写一个类C,并且将整数分配给此类的对象是有意义的,那么我可以提供一个rhsof 类型的赋值运算符int。然后我班的客户可以写:
C c;
...
c = 5;
Run Code Online (Sandbox Code Playgroud)
问题:如果这样的赋值有意义,那么隐式构造函数C(int);也应该有意义吗?如果是这样,那么我应该真正定义这个构造函数(它也有其他用途)并且永远不需要重载赋值运算符。我错过了什么吗?
c++ ×7
c++11 ×3
bash ×1
casting ×1
constructor ×1
css ×1
makefile ×1
namespaces ×1
paypal ×1
stl ×1
templates ×1
type-traits ×1