小编Jar*_*d42的帖子

使用C++ 11 auto关键字多少钱?

我一直在使用autoC++ 11标准中提供的新关键字来处理复杂模板类型,这是我认为它的设计目标.但我也用它来做:

auto foo = std::make_shared<Foo>();
Run Code Online (Sandbox Code Playgroud)

更加怀疑的是:

auto foo = bla(); // where bla() return a shared_ptr<Foo>
Run Code Online (Sandbox Code Playgroud)

我没有看到很多关于这个话题的讨论.似乎auto可能过度使用,因为类型通常是文档和健全性检查的一种形式.您在哪里绘制使用线auto以及此新功能的推荐用例是什么?

澄清:我不是要求哲学观点; 我要求标准委员会对该关键字的预期用途,可能还有关于如何在实践中实现该预期用途的评论.

旁注:此问题已移至SE.Programmers,然后返回Stack Overflow.关于这一点的讨论可以在这个元问题中找到.

c++ types type-inference auto c++11

210
推荐指数
8
解决办法
4万
查看次数

带空括号的默认构造函数

有没有什么好的理由在C++中调用默认构造函数时,一组空的圆括号(括号)无效?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error
Run Code Online (Sandbox Code Playgroud)

我似乎每次都自动输入"()".是不是有一个很好的理由不允许这样做?

c++ constructor c++-faq default-constructor most-vexing-parse

192
推荐指数
8
解决办法
3万
查看次数

为什么我应该避免函数签名中的std :: enable_if

Scott Meyers发表了他的下一本书EC++ 11的内容和状态.他写道,书中的一个项目可能是"避免std::enable_if功能签名".

std::enable_if 可以用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类.

这个问题中,显示了所有三个解决方案

作为功​​能参数:

template<typename T>
struct Check1
{
   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, int>::value >::type* = 0) { return 42; }

   template<typename U = T>
   U read(typename std::enable_if<
          std::is_same<U, double>::value >::type* = 0) { return 3.14; }   
};
Run Code Online (Sandbox Code Playgroud)

作为模板参数:

template<typename T>
struct Check2
{
   template<typename U = T, typename std::enable_if<
            std::is_same<U, int>::value, int>::type = 0>
   U read() { return 42; }

   template<typename U = T, …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae enable-if c++11

163
推荐指数
3
解决办法
4万
查看次数

指针表达式:*ptr ++,*++ ptr和++*ptr

最近我遇到了这个我自己无法理解的问题.

这三个表达式真正意味着什么?

*ptr++
*++ptr
++*ptr
Run Code Online (Sandbox Code Playgroud)

我试过里奇.但不幸的是,他无法按照他讲述的这三项行动.

我知道它们都是为了递增指针/指向的值而执行的.我还可以猜测可能有很多关于优先级和评估顺序的事情.就像一个指针首先递增指针然后取出指针的内容,一个简单地取出内容然后递增指针等等.正如你所看到的,我对他们的实际操作我没有清楚的理解,我想尽快明确.但是当我有机会将它们应用到程序中时,我真的迷失了.例如:

int main()
{
    const char *p = "Hello";
    while(*p++)
         printf("%c",*p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我这个输出:

ello
Run Code Online (Sandbox Code Playgroud)

但我的期望是它会印刷Hello.最后一个请求 - 请给出一些示例,说明每个表达式在给定的代码段中的工作原理.因为大多数时候只有一段理论飞过我的脑海.

c c++ pointers increment

117
推荐指数
4
解决办法
6万
查看次数

什么是1.0的最接近的两倍,那不是1.0?

有没有办法以编程方式获得最接近1.0的double,但实际上不是1.0?

一种hacky方法是将double转换为相同大小的整数,然后减去一个.IEEE754浮点格式的工作方式,最终将指数减少一,同时将小数部分从全零(1.000000000000)更改为全1(1.111111111111).但是存在一些机器,其中整数存储为little-endian而浮点存储为big-endian,因此并不总是有效.

c++ floating-point floating-accuracy

86
推荐指数
3
解决办法
5102
查看次数

既然我们有std :: array,那么C-style数组的用途是什么?

std::array远远优于C阵列.即使我想与遗留代码进行互操作,我也可以使用std::array::data().有什么理由我想要一个老派阵列吗?

c++ arrays initialization c++11

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

如何使用std :: string创建条件断点

假设我有这个功能:

std::string Func1(std::string myString)
{
   //do some string processing 
   std::string newString = Func2(myString)
   return newString;  
}
Run Code Online (Sandbox Code Playgroud)

如何在newString具有特定值时设置条件中断?(不改变来源)

设定条件 newString == "my value"

没有工作断点被禁用,错误"找不到重载的运算符"

debugging conditional-breakpoint visual-studio

70
推荐指数
6
解决办法
5万
查看次数

模板静态变量

我无法理解,为什么如果我们在头文件中定义普通(非模板)类的静态变量,我们有链接器错误,但是在模板的情况下一切正常,而且我们将在所有翻译单元中有单个静态变量实例:

它是模板头(template.h):

// template.h
template<typename T>
class Templ {
public:
  static int templStatic;
};

template<typename T> Templ<T>::templStatic = 0;
Run Code Online (Sandbox Code Playgroud)

它是第一个使用模板的单元(unit1.cpp)

// unit1.cpp
#include "template.h"

int method1() {
  return Templ<void>::templStatic++;
}
Run Code Online (Sandbox Code Playgroud)

这里的第二个单位(unit2.cpp):

// unit2.cpp
#include "template.h"
int method2() {
  return Templ<void>::templStatic++;
}
Run Code Online (Sandbox Code Playgroud)

最后,main.cpp:

// main.cpp
#include <iostream>
int method1();
int method2();

int main(int argc, char** argv) {
  std::cout << method1() << std::endl;
  std::cout << method2() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在编译,链接和执行此代码后,我们将得到以下输出:

0
1
Run Code Online (Sandbox Code Playgroud)

那么,为什么在模板的情况下一切正常(和预期一样)?编译器或链接器如何处理它(我们可以在分离的编译器调用中编译每个.cpp文件,然后将它们与caling链接到链接器,因此编译器和链接器不会同时"看到"所有.cpp文件)?

PS:我的编译器:msvcpp 9(但也检查了mingw)

c++ static templates

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

快速n选择k mod p为大n?

我所说的"大n"是数以百万计的东西.p是素数.

我已经尝试了 http://apps.topcoder.com/wiki/display/tc/SRM+467 但是这个功能似乎是不正确的(我用144选择6 mod 5测试了它,当它应该给我时它给了我0 2)

我试过 http://online-judge.uva.es/board/viewtopic.php?f=22&t=42690 但我完全不明白

我还做了一个memoized递归函数,它使用逻辑(组合(n-1,k-1,p)%p +组合(n-1,k,p)%p)但是它给了我堆栈溢出问题因为n很大

我尝试过卢卡斯定理,但它似乎要么缓慢还是不准确.

我所要做的就是为大n创建一个快速/准确的n选择k mod p.如果有人能帮我展示一个很好的实现,我将非常感激.谢谢.

根据要求,对于大n的命中堆栈溢出的memoized版本:

std::map<std::pair<long long, long long>, long long> memo;

long long combinations(long long n, long long k, long long p){
   if (n  < k) return 0;
   if (0 == n) return 0;
   if (0 == k) return 1;
   if (n == k) return 1;
   if (1 == k) return n;

   map<std::pair<long long, long long>, long long>::iterator it;

   if((it = memo.find(std::make_pair(n, k))) != memo.end()) {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm modular binomial-coefficients

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

在不同的空格中使用具有相同名称的变量

此代码编译,但我在Visual Studio中有运行时错误:

运行时检查失败#3 - 正在使用变量'x'而未初始化...

int x = 15;
int main()
{
    int x = x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白这种行为...当我点击继续时错误框中的程序恢复,x有一个损坏的内容(比如-8556328代替15).

为什么这段代码没有问题,并且int数组声明得很好?

const int x = 5;
int main()
{
     int x[x] = {1,2,3,4};
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ variable-declaration

40
推荐指数
3
解决办法
1704
查看次数