void func(const std::function<void()>& f = empty)
{
if(f)
f();
}
Run Code Online (Sandbox Code Playgroud)
什么是'空'应该是什么?我用[](){}.但从技术上讲,这不是空的,f()将执行.
有什么不同
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(0, 100);
for (int n = 0; n < 100; ++n)
std::cout<<dist(gen)<<std::endl;
Run Code Online (Sandbox Code Playgroud)
和
std::random_device rd;
std::uniform_int_distribution<int> dist(0, 100);
for (int n = 0; n < 100; ++n)
std::cout<<dist(rd)<<std::endl;
Run Code Online (Sandbox Code Playgroud)
第一个例子使用rd()作为种子,但输出类似,我想知道第一个优点是什么.
我首先需要来自集合的查询数据,然后根据这些数据,从集合b中查询.如:
For each id queried from a
query data from b where "_id" == id
Run Code Online (Sandbox Code Playgroud)
在SQL中,这可以通过在单个选择中连接表a和b来完成.但是在mongodb中,它需要做多查询,看起来效率低下,不是吗?或者它只能通过2个查询来完成?(一个用于a,另一个用于b,而不是1加n)我知道NoSQL不支持join,但有没有办法批量执行for循环中的查询到单个查询?
我的应用有一些事件,每个事件都可以有一些动作.这些操作在C++中实现.我想将这些核心函数暴露给python并使用python来编写动作.优点是我可以修改操作而无需重新编译.例如:
CppClass o;
// --- this is a action----
o.f1();
o.f2();
// ------------------------
Run Code Online (Sandbox Code Playgroud)
使用python编写动作脚本:
def action1(o):
o.f1()
o.f2()
Run Code Online (Sandbox Code Playgroud)
在c ++中,使用解释器来运行此脚本,找到action1并使用从c ++对象转换的PyObject调用它.实际上,我没有将f1()和f2()暴露给python,我只是使用python重组动作的定义,所有函数都是由c ++二进制代码运行的.请注意,我没有在python中给出f1()和f2()的定义.
问题是:我如何公开全局函数?如:
def action2():
gf1()
gf2()
Run Code Online (Sandbox Code Playgroud)
boost :: python可以公开函数,但它不同,它需要编译一个DLL文件而main()属于python脚本.当然我可以使全局函数成为类静态成员,但我只是想知道.请注意,我必须在python中给出gf1()和gf2()的定义.
Jython可以很容易地做到这一点:只需在python代码中导入Xxx并调用Xxx.gf1()即可.但是在cython中,我如何在python中定义gf1()?这是一种扩展,但扩展需要提前编译Xxx.似乎只有将gf()变成一个类?
我想在c ++ app中使用embed python并调用python脚本中定义的函数.函数的参数是一个c ++对象.看我的代码:
class Test
{
public:
void f()
{
std::cout<<"sss"<<std::endl;
}
};
int main()
{
Py_Initialize();
boost::python::object main = boost::python::import("__main__");
boost::python::object global(main.attr("__dict__"));
boost::python::object result = boost::python::exec_file("E:\\python2.py", global, global);
boost::python::object foo = global["foo"];
if(!foo.is_none())
{
boost::python::object pyo(boost::shared_ptr<Test>(new Test())); // compile error
foo(pyo);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
python2.py:
def foo(o):
o.f()
Run Code Online (Sandbox Code Playgroud)
如何将c ++对象传递给foo?我知道swig可以做到这一点,但是boost :: python?
我发现的关于可见性的所有例子都是基本类型的例子.我想知道的是:如果一个对象在堆中新建,当一个线程调用其方法来改变其状态时,没有锁定或同步,其他线程会看到这个变化?想象一下Java.Colletion对象,一个线程调用它的add()方法
有人说堆中的对象仍然存在可见性问题,但JLS说:17.4.1共享变量可以在线程之间共享的内存称为共享内存或堆内存.
和 http://www.artima.com/insidejvm/ed2/jvm2.html说:线程的Java堆栈存储线程的Java(非本机)方法调用的状态.Java方法调用的状态包括其局部变量,调用它的参数,返回值(如果有)和中间计算.
所以我认为,JVM不会将堆中的对象复制到CPU缓存中.如果这是正确的,堆中的对象将不会有可见性问题,因为线程只引用堆中的对象.
BTW假设当一个线程调用.add()时会出现并发问题.在正常过程中,更改必须使用锁定保护,因此这个问题不是问题.但我只是想知道:)
我用来java.util.Timer在我的应用程序中触发作业,但我发现它取决于系统时间:如果调整系统时间,定时器的触发器将受到影响.
例如,如果系统时间回退80秒,计时器将停止工作80秒.
Java有一种System.nanoTime独立于系统时间的方法,但它似乎无法使用Timer.
是否有Timer库支持我需要的东西?或者我必须自己实施?
请注意,我不需要精确的当前时间(日期),我需要一个精确的时间间隔
a doc {"m":[1,2,3], "others":xxx},通过以下方式获取数组 'm' 中的第一个元素:
db.find({query},{"m":{$slice:1}, "m":1})
Run Code Online (Sandbox Code Playgroud)
返回的是{"m":[1]},doc中的元素是一个数组。但在这个查询中,只会获取数组中的一个元素,因此我不需要返回文档包含只有一个元素的数组。这就像子查询中的 SQL 局部变量。我想要的元素在原始文档中没有名称,如果我想获取它,那么我需要为它命名,我想要的返回文档类似于: {"localVariable":1} 而不是 {"m":[1 ]}
我尝试通过以下方式投影出第一个元素:
db.find({query},{"m":{$slice:1}, "m.1":1})
Run Code Online (Sandbox Code Playgroud)
但这行不通。
我想要在python中生成的protobuf类的智能感知。但是生成的protobuf类的实现是特殊的,代码类似于:
class X(_message.Message):
__metaclass__ = _reflection.GeneratedProtocolMessageType
DESCRIPTOR = _X
Run Code Online (Sandbox Code Playgroud)
大多数的Python IDE只能智能感知__metaclass__和DESCRIPTOR两个成员而不是成员.proto文件中定义。
怎么做?
动画从点a移动到b,在动作中,动画需要循环播放.例如,子弹移动到一个点,这个子弹是一个应该循环播放的动画.
CCSequence::create(
CCSpawn::createWithTwoActions(
CCTargetedAction::create(sprite, CCMoveTo::create(3.0f, point_a)),
CCTargetedAction::create(sprite, CCRepeatForever::create(CCAnimate::create(animation)))
),0);
Run Code Online (Sandbox Code Playgroud)
但是CCRepeatForever不能成为动作序列的成员.那怎么办呢?我使用序列,因为有其他行为排队(上面省略)