我想执行以下操作:如果PATH中存在CCache,请使用"ccache g ++"进行编译,否则使用g ++.我尝试编写一个包含的小型my-cmake脚本
CC="ccache gcc" CXX="ccache g++" cmake $*
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用(运行make仍然不使用ccache;我使用CMAKE_VERBOSE_MAKEFILE检查了这一点).
更新:
根据此链接,我尝试将脚本更改为
cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*
Run Code Online (Sandbox Code Playgroud)
但cmake抱怨说使用编译器ccache测试失败(可以预料).
重用移动容器的正确方法是什么?
std::vector<int> container;
container.push_back(1);
auto container2 = std::move(container);
// ver1: Do nothing
//container2.clear(); // ver2: "Reset"
container = std::vector<int>() // ver3: Reinitialize
container.push_back(2);
assert(container.size() == 1 && container.front() == 2);
Run Code Online (Sandbox Code Playgroud)
从我在C++ 0x标准草案中读到的内容; ver3似乎是正确的方法,因为移动后的对象在a中
"除非另有规定,否则此类移动物体应处于有效但未指明的状态."
我从来没有找到任何"以其他方式指定"的实例.
虽然我发现ver3有点回旋并且会有更多首选ver1,虽然vec3可以允许一些额外的优化,但另一方面很容易导致错误.
我的假设是否正确?
我有一个AsyncTask对象,它在创建活动时开始执行,并在后台执行操作(下载最多100个图像).一切都很好,但有一种我不能理解的特殊行为.
例如:当Android屏幕的方向发生变化时,活动将被销毁并再次创建.所以我重写onRetainNonConfigurationInstance()方法并保存在AsyncTask中执行的所有下载数据.我这样做的目的是每次在方向更改期间销毁活动时都不会运行AsyncTask,但正如我在日志中可以看到的,之前的AsyncTask仍然在执行.(虽然数据保存正确)
我甚至尝试在活动的onDestroy()方法中取消AsyncTask,但日志仍然显示AsyncTask正在运行.
这是非常奇怪的行为,如果有人能告诉我停止/取消AsyncTask的正确程序,真的很感激.
谢谢
我有一个经常出现的代码块,我循环遍历所有成员enum class.
for与新的相比,我目前使用的循环看起来非常笨拙range-based for.
有没有办法利用新的C++ 11功能来减少当前for循环的详细程度?
我希望改进的当前代码:
enum class COLOR
{
Blue,
Red,
Green,
Purple,
First=Blue,
Last=Purple
};
inline COLOR operator++( COLOR& x ) { return x = (COLOR)(((int)(x) + 1)); }
int main(int argc, char** argv)
{
// any way to improve the next line with range-based for?
for( COLOR c=COLOR::First; c!=COLOR::Last; ++c )
{
// do work
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
换句话说,如果我可以做以下事情会很好:
for( const auto& c : COLOR )
{
// …Run Code Online (Sandbox Code Playgroud) 我正在使用Mongo shell来查询我的Mongo数据库.我想使用ObjectID中包含的时间戳作为我的查询的一部分,也作为一个列提取到输出中.我已经设置了Mongo来自己创建ObjectID.
我的问题是我无法找到如何使用ObjectID来提取其时间戳.
以下是我试图开始工作的查询.'createdDate'字段是占位符; 不确定正确的字段是什么:
//Find everything created since 1/1/2011
db.myCollection.find({date: {$gt: new Date(2011,1,1)}});
//Find everything and return their createdDates
db.myCollection.find({},{createdDate:1});
Run Code Online (Sandbox Code Playgroud) 该ObjectId用作MongoDB的文档的默认密钥嵌入时间戳(调用objectid.generation_time返回datetime对象).那么可以使用这个生成时间而不是保持单独的创建时间戳吗?您将如何使用此嵌入式时间戳有效地按创建时间或查询最后N个项目进行排序?
看来关于C++ 0x的rvalues的主要建议是添加移动构造函数并将运算符移动到类中,直到编译器默认实现它们.
但是如果使用VC10,等待是一种失败的策略,因为自动生成可能不会在VC10 SP1之前,或者在最坏的情况下,VC11.可能,等待这个将是多年来衡量.
这就是我的问题.编写所有这些重复的代码并不好玩.这看起来很不愉快.但对于那些认为很慢的课程来说,这是一个很受欢迎的负担.对于数百个(如果不是数千个)较小的类而言,情况并非如此.
::叹气:: C++ 0x应该让我写更少的代码,而不是更多!
然后我有了一个想法.很多人都愿意共享,我猜.
为什么不按价值传递一切?不会std :: move + copy elision使这几乎达到最佳状态吗?
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // single copy
OurClass(SomeClass()); // single copy
Run Code Online (Sandbox Code Playgroud)
缺点: rvalues的浪费副本.
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
OurClass::OurClass(SomeClass&& obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // zero copies, one move
OurClass(SomeClass()); // zero copies, one move
Run Code Online (Sandbox Code Playgroud)
优点:大概是最快的.
缺点:很多代码!
给出以下代码:
void f()
{
class A
{
template <typename T>
void g() {}
};
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.4(以及 g++-4.6 -std=gnu++0x)抱怨:"本地类中成员模板的声明无效".
显然,本地类不允许有模板成员.这种限制的目的是什么?它会在C++ 0x中删除吗?
注意:如果我将本地类本身设为模板,而不是给它一个模板成员:
void f()
{
template <typename T>
class A
{
void g() {}
};
}
Run Code Online (Sandbox Code Playgroud)
我得到"错误:模板声明不能出现在块范围内".
当你有一个带有移动构造函数的派生对象,并且基础对象也有移动语义时,从派生对象移动构造函数调用基础对象移动构造函数的正确方法是什么?
我首先尝试了最明显的事情:
Derived(Derived&& rval) : Base(rval)
{ }
Run Code Online (Sandbox Code Playgroud)
但是,这似乎最终调用了Base对象的复制构造函数.然后我尝试std::move在这里明确使用,像这样:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
Run Code Online (Sandbox Code Playgroud)
这有效,但我很困惑为什么这是必要的.我以为std::move只返回一个右值引用.但是因为在这个例子rval中已经是一个右值引用,所以调用std::move应该是多余的.但如果我不在std::move这里使用,它只是调用复制构造函数.那么为什么要求std::move必要?