如果我将任意数量的操纵器应用于流,是否有办法以通用方式撤消这些操纵器的应用程序?
例如,请考虑以下事项:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "Hello" << hex << 42 << "\n";
// now i want to "roll-back" cout to whatever state it was in
// before the code above, *without* having to know
// what modifiers I added to it
// ... MAGIC HAPPENS! ...
cout << "This should not be in hex: " << 42 << "\n";
}
Run Code Online (Sandbox Code Playgroud)
假设我想添加代码MAGIC HAPPENS,将流操纵器的状态恢复到我之前的状态cout << hex.但我不知道我添加了什么操纵器.我怎么能做到这一点?
换句话说,我希望能够写出这样的东西(psudocode/fantasy …
在RubyMine中输入一个简单的文字字符串数组时:
cols =
[
"Col1",
"Col2"
]
Run Code Online (Sandbox Code Playgroud)
RubyMine抱怨我更喜欢使用%w文字数组:
cols = %w(Col1 Col2)
Run Code Online (Sandbox Code Playgroud)
它提供了一个Ruby样式指南(这里)的链接,该指南说:
当需要字符串数组时,首选%w到文字数组语法.
# bad
STATES = ['draft', 'open', 'closed']
# good
STATES = %w(draft open closed)
Run Code Online (Sandbox Code Playgroud)
我可以看到如何%w提供可能更简洁的代码.除了简洁之外,有没有理由更喜欢一种方法而不是另一种方法?
我试图清理使用一些代码char*与std::string跑进由下面的代码所示的问题.
void Foo( int xIn , const std::string & fooIn )
{
std::cout << "string argument version called \n";
}
void Foo( int xIn , bool flagIn = true )
{
std::cout << "bool argument version called \n";
}
int main()
{
int x = 1;
Foo( x , "testing" );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,我得到bool参数版本调用.是一个char*以bool转换优于char*到const std::string&或Visual Studio 2008中捉弄我吗?
g ++ 4.7.2是否实现std::set::emplace,如C++ 11标准所定义并在此处记录?
我写了以下小测试用例:
#include <set>
#include <string>
struct Foo
{
std::string mBar;
bool operator<(const Foo& rhs) const
{
return mBar < rhs.mBar;
}
Foo(const std::string bar) : mBar(bar) {};
};
typedef std::set<Foo> Foos;
int main()
{
Foos foos;
foos.emplace(std::string("Hello"));
}
Run Code Online (Sandbox Code Playgroud)
在G ++ 4.7.2下,这无法编译:
[john.dibling@somewhere hacks]$ g++ -o main.o -std=c++0x -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Foos’ has no member named ‘emplace’
Run Code Online (Sandbox Code Playgroud)
也无法在IDEOne下编译,但它在MSVC 2012 Update 1下编译.
在C++ 11中是否可以shared_ptr用来控制非指针资源?
可以用来unique_ptr管理非指针资源.这是通过实现自定义删除器类来完成的,该类提供:
typedef {TYPE} pointer;其中{TYPE}是非指针资源类型operator()(pointer) 它释放了受控资源...然后unique_ptr使用自定义删除器作为第二个模板参数实例化a .
例如,在Windows下,可以创建一个unique_ptr管理服务控制句柄的程序.此句柄类型不会通过调用释放delete,而是通过调用释放CloseServiceHandle().以下是执行此操作的示例代码:
struct SvcHandleDeleter
{
typedef SC_HANDLE pointer;
SvcHandleDeleter() {};
template<class Other> SvcHandleDeleter(const Other&) {};
void operator()(pointer h) const
{
CloseServiceHandle(h);
}
};
typedef std::unique_ptr<SC_HANDLE,SvcHandleDeleter> unique_sch;
Run Code Online (Sandbox Code Playgroud)
unique_sch scm(::OpenSCManagerA(0, 0, SC_MANAGER_ALL_ACCESS));
Run Code Online (Sandbox Code Playgroud)
是否可以用来shared_ptr控制非指针资源?
根据文档,有shared_ptr构造函数重载提供了提供自定义删除类的方法,但是没有一个构造函数接受的资源类型不是指针或指针周围的包装器.
如何才能做到这一点?
这不能用C++编译:
class A
{
};
class B : public A
{
};
...
A *a = new B();
B *b = dynamic_cast<B*>(a);
Run Code Online (Sandbox Code Playgroud) 我在我的工作站上有一个本地git仓库,我将其推送到Dropbox位置,以便我可以将其下载到我的笔记本电脑上git pull remote dropbox.
昨天我检查了我的工作站上的更改,提交了它并且git push dropbox编辑了它.我没有git pull从我的笔记本电脑上做一个,因为我怀疑我最终会把这个提交扔掉.
今天我决定抛弃那个提交,所以在我的工作站上我做了:
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我想把它推回到Dropbox,这样在我的笔记本电脑上我可以从那里合并和提交.所以在我的工作站上我尝试过:
git push dropbox
Run Code Online (Sandbox Code Playgroud)
而git抱怨说:
![已拒绝] master - > master(非快进)错误:无法将某些引用推送到'\ My Dropbox\dev\repos\xcast.git'为了防止您丢失历史记录,拒绝了非快进更新在再次按下之前合并远程更改(例如'git pull').有关详细信息,请参阅"git push --help"中的"关于快进的注意事项"部分.
如何让我的恶化和Dropbox再次同步?
它是否正确 ?这是用g ++(3.4)成功编译的.
int main()
{
int x = 12;
char pz[x];
}
出于这个问题的目的,我只对标准兼容的C++感兴趣,而不是C或C++ 0x,而不是任何特定于实现的细节.
问题从不时出现有关之间的差异#include ""和#include <>.这个论点通常归结为两个不同之处:
#include <>是"标题",而是#include """源文件".以下是相关参考:ISO/IEC 14882:2003(E)
16.2源文件包含[cpp.include]
1 #include指令应标识可由实现处理的头文件或源文件.
2表单的预处理指令
Run Code Online (Sandbox Code Playgroud) 搜索的实现所定义的地方的序列为一个标头由<和>分隔符之间的指定序列唯一地标识,并且使得由标题的全部内容替换该指令的.如何指定场所或标识的头是实现定义的.# include < h-char-sequence > new-line3表单的预处理指令
Run Code Online (Sandbox Code Playgroud) 导致由"delimiters"之间的指定序列标识的源文件的全部内容替换该指令.以实现定义的方式搜索指定的源文件.如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样# include "q-char-sequence" new-lineRun Code Online (Sandbox Code Playgroud) 使用原始指令中相同的包含序列(包括>字符,如果有的话).# include < h-char-sequence > new-line
(上面引用的重点是我的.)这种差异的含义似乎是标准打算区分"标题"和"源文件",但文档中没有一个定义这些术语中的任何一个或它们之间的区别.
其他几个地方甚至没有提到标题或源文件.一些:
158)标题不一定是源文件,标题名称中分隔的序列也不一定是有效的源文件名(16.2).
似乎暗示标题可能不在文件系统中,但它也没有说源文件.
2词汇约定[lex]
1该程序的文本保存在本国际标准中称为源文件的单元中.通过预处理指令将源文件与所有头文件(17.4.1.2)和包含的源文件(16.2)一起
#include,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,称为转换单元.[注意:C + +程序不需要同时翻译.]
这是我能找到的最接近定义的内容,它似乎暗示标题不是"程序的文本".但如果你#include是一个标题,它不会成为该程序文本的一部分吗?这有点误导.
什么是标题?什么是源文件?
c++ ×7
c++11 ×2
c++-faq ×1
cuda ×1
dynamic-cast ×1
g++ ×1
g++-4.7 ×1
git ×1
libstdc++ ×1
optimization ×1
profiling ×1
ruby ×1
shared-ptr ×1
visual-c++ ×1