在Python 2.7+中,我可以使用object_pairs_hook内置的json模块来更改已解码对象的类型.无论如何还要为列表做同样的事情吗?
一种选择是通过我获得的对象作为钩子的参数并用我自己的列表类型替换它们,但是还有其他更聪明的方法吗?
在下面的头文件中,我想获得+reflect对类和成员变量的相应注释:
#ifndef __HEADER_FOO
#define __HEADER_FOO
//+reflect
class Foo
{
public:
private:
int m_int; //+reflect
};
#endif
Run Code Online (Sandbox Code Playgroud)
使用libclang的python绑定和以下脚本:
import sys
import clang.cindex
def dumpnode(node, indent):
print ' ' * indent, node.kind, node.spelling
for i in node.get_children():
dumpnode(i, indent+2)
def main():
index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1], args=['-x', 'c++'])
dumpnode(tu.cursor, 0)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
给我这个输出:
CursorKind.TRANSLATION_UNIT None
CursorKind.TYPEDEF_DECL __builtin_va_list
CursorKind.CLASS_DECL type_info
CursorKind.CLASS_DECL Foo
CursorKind.CXX_ACCESS_SPEC_DECL
CursorKind.CXX_ACCESS_SPEC_DECL
CursorKind.FIELD_DECL m_int
Run Code Online (Sandbox Code Playgroud)
问题是缺少评论.它们被预处理器剥离了吗?有什么方法可以阻止这种情况吗?
我正在尝试将一个工具集成到Xcode 4中,该工具从描述符文件生成C头.在Xcode 3中,它为具有特定扩展名的文件添加了自定义构建步骤.然后在包含它们的.m/.mm/.cpp文件之前编译这些文件.当我尝试使用Xcode 4执行此操作时,它似乎在编译其他源之后运行我的自定义步骤.这当然不起作用.有没有办法告诉Xcode以前的步骤?
这是一个简单的repro设置:

我的main.m包含一个:
#include <mytest.h>
Run Code Online (Sandbox Code Playgroud)
我已添加${DERIVED_FILE_DIR}到标题搜索路径.当我编译这个项目时,我得到以下内容:

如果我删除包含并再次构建它我得到这个:

因此规则确实有效,但执行方式为时已晚.有没有办法改变这种行为?
我正在尝试从纹理图集中绘制一个由较小的瓷砖组成的基本2d地面网格(请注意1像素透明边框):

我使用以下代码将tile渲染为纹理四边形:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_SHORT, 0, &m_coords[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_uvs[0]);
glDrawArrays(GL_TRIANGLES, 0, m_coords.size() / 2);
glBindTexture(GL_TEXTURE_2D, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
这些位置显然是整数坐标.角的UV坐标计算如下:
u0 = float(x) / float(texWidth);
v0 = float(y) / float(texHeight);
u1 = float(x+w) / float(texWidth);
v1 = float(y+h) / float(texHeight);
Run Code Online (Sandbox Code Playgroud)
其中w和h是没有填充的瓷砖的大小.
当模型视图变换被捕捉到整数位置(右)时看起来很棒,但是当它开始移动时,我会在图块之间得到黑色东西(左):

根据我的理解,我应该用半个纹素偏移UV坐标以使其工作,但是如果我将UV计算更改为:
u0 = float(x+0.5f) / float(texWidth);
v0 = float(y+0.5f) / float(texHeight);
u1 = float(x+w-0.5f) / float(texWidth);
v1 = float(y+h-0.5f) / float(texHeight);
Run Code Online (Sandbox Code Playgroud)
它仍然无法正常工作.这是正确的方法吗?我需要混合才能使用吗?如果我偏移了瓷砖以确保它们被捕捉到像素网格它可以工作,但这会使它在移动缓慢时快速捕捉.人们通常如何解决这个问题?
编辑
我应该说它是在iphone上.
基于一些谷歌搜索,似乎ios上的JavaScript有时是JIT编译,有时不是.如何在ios 7中添加JavaScriptCore框架?如果我在我的应用程序中使用它,我会获得JIT编译吗?
我有一个像这样的字符串列表:
['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
Run Code Online (Sandbox Code Playgroud)
我想'**', '**'用一个替换'**',但'bar', 'bar'保持完整.即用一个连续替换任何连续数字'**'.我当前的代码如下所示:
p = ['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
np = [p[0]]
for pi in range(1,len(p)):
if p[pi] == '**' and np[-1] == '**':
continue
np.append(p[pi])
Run Code Online (Sandbox Code Playgroud)
有没有更多的pythonic方式来做到这一点?
我有一个模板包装函数,它返回一个这样的值:
template<class T>
T foo(Bar& bar, const char* key) {
return bar.value<T>(key);
}
Run Code Online (Sandbox Code Playgroud)
但我希望它处理指针类型有点不同,像这样:
template<class T>
T foo(Bar& bar, const char* key) {
return (T)bar.value<void*>(key);
}
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
int x = foo<int>(bar, "x");
Baz* b = foo<Baz*>(bar, "b");
Run Code Online (Sandbox Code Playgroud)
像上面那样写它显然会因为多个定义而给我一个错误.有没有其他方法可以做到这一点?我宁愿不为每个使用指针的函数添加一个强制转换.
我尝试过以下方法:
template<class T>
T foo(Bar& bar, const char* key) {
if(std::is_pointer<T>::value)
return (T)bar.value<void*>(key);
else
return bar.value<T>(key);
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为涉及QVariants并且它们通过仅使用未知指针类型(the bar.value<T>)实例化其模板函数之一而产生错误.
我正在尝试在编译时找到一个constexpr兼容的哈希函数用于散列字符串.字符串的数量非常小(<10)并且我对碰撞进行了单独检查,因此算法可能远非完美.我在互联网上找到了以下版本的FNV1A:
static constexpr unsigned int Fnv1aBasis = 0x811C9DC5;
static constexpr unsigned int Fnv1aPrime = 0x01000193;
constexpr unsigned int hashFnv1a(const char *s, unsigned int h = Fnv1aBasis)
{
return !*s ? h : hashFnv1a(s + 1, (h ^ *s) * Fnv1aPrime);
}
Run Code Online (Sandbox Code Playgroud)
但是当我在MSVS 2015中编译它时,我得到以下警告:
warning C4307: '*': integral constant overflow
Run Code Online (Sandbox Code Playgroud)
由于函数中只有一个乘法我会假设警告来自(h ^ *s) * Fnv1aPrime.这是有道理的,因为乘以0x811C9DC5(Fnv1aBasis)几乎任何东西都会使32位整数溢出.
有什么方法可以解决这个问题吗?我已经尝试了几个其他constexpr函数,我发现它们用于散列字符串,但它们都有相同的问题.