小编bit*_*ask的帖子

如何格式化浮点值,使其从不使用指数表示法,也不具有尾随零?

的ios_base操纵,我基本上之间的选择defaultfloatfixed不带指数的符号格式浮点数时(有小数).

但是,我想选择最大精度,它会为许多数字产生很多尾随零fixed(例如1.),但避免使用指数表示法.如果设置为defaultfloat,它将在大多数时间看起来正确,除非值非常小,但不是0..在这种情况下,默认表示单独切换到科学记数法,这打破了格式化输出的接收者(因为它不知道是什么2.22045e-16意思.

那么,我怎么能吃馅饼呢?也就是说,没有不必要的尾随零的非指数表示法.


注意:我没有测试defaultfloat标志的效果,因为我的gcc似乎没有实现那个标志(但是),但我认为它是默认设置,适用时不使用任何标志.我确实检查了fixed标志,它确实按预期运行.

c++ floating-point iostream string-formatting

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

如果设置了变量,如何强制重建目标?

假设我有一个构建目标 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 中有什么东西可以做到这一点吗?我的黑客(参见答案)似乎不是最优雅的,但它有效。还有更好的吗?

makefile build-system command-line-arguments

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

为什么对象的初始化会调用复制构造函数?

考虑以下最小的工作示例:

#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

c++ initialization atomic copy-constructor

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

在一个只有const shared_ptr的unordered_set中找到一个shared_ptr?

我有一个unordered_set<shared_ptr<T>> us,我想知道针k是否在us,但k有类型shared_ptr<T const>所以unordered_set<shared_ptr<T>>::find抱怨它无法转换.

有没有解决的办法?也许通过直接提供哈希?

我确实尝试过const_cast(感觉很脏),但没有削减它.

c++ const unordered-set

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

initializer_list 是否被视为 C++ 核心语言的一部分?

我问是因为auto推断{}initializer_list。我不知道核心语言像这样依赖标准库中的任何其他类。你可以去掉vectoror array,C++ 仍然可以运行,但是去掉initializer_list它就会崩溃。

c++ initializer-list language-lawyer

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

接口范式性能(动态绑定与泛型编程)

虽然它们的核心动态绑定和模板是根本不同的东西,但它们可用于实现相同的功能.

代码示例(仅供参考)

A)动态绑定

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++ metaprogramming dynamic-binding

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

自动销毁静态对象

为什么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++ templates static-members

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

递归类型真的是构建非连续任意大小数据结构的唯一方法吗?

我刚刚注意到一个问题,询问递归数据类型("自引用类型")在C++中是否有用,我很想大胆宣称

这是构建数据结构(更准确地说是容器)的唯一方法,它可以接受任意大数据集合而不使用连续的内存区域.

也就是说,如果你没有随机访问数组,你需要一些引用(逻辑上)对该类型内的类型的方法(显然,不是有一个MyClass* next你可以说的成员,void* next但仍然指向一个MyClass对象或派生的类型).

但是,我对绝对陈述很谨慎 - 只因为我想不出某些东西并不意味着它不可能,所以我忽略了什么?是否有数据结构既没有使用类似于链表/树的机制进行组织,也没有使用连续序列?


注意:这被标记为因为我特别感兴趣的是C++语言,但也有理论方面.

c++ language-agnostic data-structures

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

具有多个非可选参数的转换构造函数如何看起来如何?为什么它有意义?

至于我使用"转换构造函数",它们看起来像这样:

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按构造函数转换

  1. 无功能说明符中声明的构造explicit 可与一个单一的参数被称为指定从一个转换的第一个参数的类型 的类型及其参数到它的类的类型.这样的构造函数称为转换构造函数.

(斜体最初加下划线,但降价不接受<u>)

这似乎表明,它正在改变,一个转换构造函数不具有可以被调用"用一个参数",并从"类型的第一个参数"到"型的变化小号它的参数"(注意是复数!)进一步支持这个.虽然我希望"其第一个参数的类型"将更改为"其单个非可选参数的类型"(1)或甚至"接收显式参数的参数类型"(2)以便允许这些:

struct Z {
  Z(A = a, B, C = c); // (1)
  Z(D …
Run Code Online (Sandbox Code Playgroud)

c++ constructor type-conversion language-lawyer c++11

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

变得有用吗?

在我看来,人们,特别是在学习C编程语言时,仍然使用该gets函数从stdin读取数据.尽管它已经从C11标准中删除了1,并且关于cppreference的免责声明如下:

gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击.它不能安全使用(除非程序在限制stdin上可能出现的内容的环境中运行).因此,该功能已在C99标准的第三个更正中弃用,并在C11标准中完全删除.fgets()和gets_s()是推荐的替代品.

永远不要使用gets().

然而,似乎这不是一个提出更多现代编程哲学的新问题.它本来会被破坏并导致程序崩溃,我看不出"限制stdin上出现的内容的环境"可能意味着什么.

那么,它过去是否有用?或者它被添加到以前的标准和预标准版本的C的原因是什么?


(1) ......或至少更改为具有指示要读取的最大长度的附加参数.然而,我询问旧签名,只接收指针.

c history gets standard-library

7
推荐指数
2
解决办法
322
查看次数