我一直在使用auto
C++ 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++中调用默认构造函数时,一组空的圆括号(括号)无效?
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
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) 最近我遇到了这个我自己无法理解的问题.
这三个表达式真正意味着什么?
*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
.最后一个请求 - 请给出一些示例,说明每个表达式在给定的代码段中的工作原理.因为大多数时候只有一段理论飞过我的脑海.
有没有办法以编程方式获得最接近1.0的double,但实际上不是1.0?
一种hacky方法是将double转换为相同大小的整数,然后减去一个.IEEE754浮点格式的工作方式,最终将指数减少一,同时将小数部分从全零(1.000000000000)更改为全1(1.111111111111).但是存在一些机器,其中整数存储为little-endian而浮点存储为big-endian,因此并不总是有效.
std::array
远远优于C阵列.即使我想与遗留代码进行互操作,我也可以使用std::array::data()
.有什么理由我想要一个老派阵列吗?
假设我有这个功能:
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"
没有工作断点被禁用,错误"找不到重载的运算符"
我无法理解,为什么如果我们在头文件中定义普通(非模板)类的静态变量,我们有链接器错误,但是在模板的情况下一切正常,而且我们将在所有翻译单元中有单个静态变量实例:
它是模板头(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)
我所说的"大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) 此代码编译,但我在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)