据的ios_base操纵,我基本上之间的选择defaultfloat和fixed不带指数的符号格式浮点数时(有小数).
但是,我想选择最大精度,它会为许多数字产生很多尾随零fixed(例如1.),但避免使用指数表示法.如果设置为defaultfloat,它将在大多数时间看起来正确,除非值非常小,但不是0..在这种情况下,默认表示单独切换到科学记数法,这打破了格式化输出的接收者(因为它不知道是什么2.22045e-16意思.
那么,我怎么能吃馅饼呢?也就是说,没有不必要的尾随零的非指数表示法.
注意:我没有测试defaultfloat标志的效果,因为我的gcc似乎没有实现那个标志(但是),但我认为它是默认设置,适用时不使用任何标志.我确实检查了fixed标志,它确实按预期运行.
假设我有一个构建目标 foo:
foo:foo.c
$(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo
Run Code Online (Sandbox Code Playgroud)
现在,ARGS我在命令行上传递了一些内容:
$ make ARGS:=-DX=1 foo
Run Code Online (Sandbox Code Playgroud)
所以,我需要绕过 make 的聪明才智,因为foo目标不仅取决于哪些文件发生了更改,还取决于ARGS.
make 中有什么东西可以做到这一点吗?我的黑客(参见答案)似乎不是最优雅的,但它有效。还有更好的吗?
考虑以下最小的工作示例:
#include <atomic>
int main() {
::std::atomic<bool> a = false;
}
Run Code Online (Sandbox Code Playgroud)
复制ctor和原子的复制分配都被明确删除.但是,这应该调用ctor完全是一个bool.
g ++和clang ++都抱怨此行试图调用以下内容的副本atomic:
$ g++ -std=c++1z a.cpp
a.cpp: In function ‘int main()’:
a.cpp:4:27: error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’
::std::atomic<bool> a = false;
^~~~~
$ clang++ -std=c++1z a.cpp
a.cpp:4:23: error: copying variable of type '::std::atomic<bool>' invokes deleted constructor
::std::atomic<bool> a = false;
^ ~~~~~
Run Code Online (Sandbox Code Playgroud)
他们为什么要复制atomic?
我有一个unordered_set<shared_ptr<T>> us,我想知道针k是否在us,但k有类型shared_ptr<T const>所以unordered_set<shared_ptr<T>>::find抱怨它无法转换.
有没有解决的办法?也许通过直接提供哈希?
我确实尝试过const_cast(感觉很脏),但没有削减它.
我问是因为auto推断{}是initializer_list。我不知道核心语言像这样依赖标准库中的任何其他类。你可以去掉vectoror array,C++ 仍然可以运行,但是去掉initializer_list它就会崩溃。
虽然它们的核心动态绑定和模板是根本不同的东西,但它们可用于实现相同的功能.
namespace DB {
// interface
class CustomCode {
public:
virtual void operator()(char) const = 0;
};
class Lib {
public:
void feature(CustomCode const& c) {
c('d');
}
};
// user code
class MyCode1 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "1: " << i << std::endl;
}
};
class MyCode2 : public CustomCode {
public:
void operator()(char i) const {
std::cout << "2: " << i << std::endl;
}
};
void use() …Run Code Online (Sandbox Code Playgroud) 为什么C++不创建/销毁模板类型的静态成员.
请注意以下示例:
#include <iostream>
struct Dump {
Dump() {
std::cout << "CTOR" << std::endl;
}
~Dump() {
std::cout << "DTOR" << std::endl;
}
};
template <typename T> struct X {
static Dump dump;
};
template <typename T> Dump X<T>::dump;
struct A : X<A> {
};
int main() {
A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我原本以为在执行时我会看到CTOR后跟的字符串DTOR.虽然我没有.我在这里错过了什么?
它与dump成为模板类型的成员有关,但就我而言.
我刚刚注意到一个问题,询问递归数据类型("自引用类型")在C++中是否有用,我很想大胆宣称
这是构建数据结构(更准确地说是容器)的唯一方法,它可以接受任意大数据集合而不使用连续的内存区域.
也就是说,如果你没有随机访问数组,你需要一些引用(逻辑上)对该类型内的类型的方法(显然,不是有一个MyClass* next你可以说的成员,void* next但仍然指向一个MyClass对象或派生的类型).
但是,我对绝对陈述很谨慎 - 只因为我想不出某些东西并不意味着它不可能,所以我忽略了什么?是否有数据结构既没有使用类似于链表/树的机制进行组织,也没有使用连续序列?
至于我使用"转换构造函数",它们看起来像这样:
struct X {
X(A); // conversion from A -> X
X(B,C = someC); // conversion from B -> X, with some default C
};
X x1 = A(); // calls X::X(A())
X x2 = B(); // calls X::X(B(),someC)
Run Code Online (Sandbox Code Playgroud)
这是完全合理的,据我所知,只要你没有构造函数:
struct Y {
Y(A,B); // no implicit conversion
};
Run Code Online (Sandbox Code Playgroud)
然而,这是它变得有趣的地方,C++ 11标准从字面上读取:
12.3.1按构造函数转换
- 无功能说明符中声明的构造
explicit可与一个单一的参数被称为指定从一个转换的第一个参数的类型的类型及其参数到它的类的类型.这样的构造函数称为转换构造函数.
(斜体最初加下划线,但降价不接受<u>)
这似乎表明,它正在改变,一个转换构造函数不具有可以被调用"用一个参数",并从"类型的第一个参数"到"型的变化小号它的参数"(注意是复数!)进一步支持这个.虽然我希望"其第一个参数的类型"将更改为"其单个非可选参数的类型"(1)或甚至"接收显式参数的参数类型"(2)以便允许这些:
struct Z {
Z(A = a, B, C = c); // (1)
Z(D …Run Code Online (Sandbox Code Playgroud) 在我看来,人们,特别是在学习C编程语言时,仍然使用该gets函数从stdin读取数据.尽管它已经从C11标准中删除了1,并且关于cppreference的免责声明如下:
gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击.它不能安全使用(除非程序在限制stdin上可能出现的内容的环境中运行).因此,该功能已在C99标准的第三个更正中弃用,并在C11标准中完全删除.fgets()和gets_s()是推荐的替代品.
永远不要使用gets().
然而,似乎这不是一个提出更多现代编程哲学的新问题.它本来会被破坏并导致程序崩溃,我看不出"限制stdin上出现的内容的环境"可能意味着什么.
那么,它过去是否有用?或者它被添加到以前的标准和预标准版本的C的原因是什么?
(1) ......或至少更改为具有指示要读取的最大长度的附加参数.然而,我询问旧签名,只接收指针.