小编qri*_*kko的帖子

Lua运算符,为什么不定义+ =, - =等等?

这个问题我有一段时间以来一直有点恼火,而且从来没有到处寻找答案.

但是我想我至少可以问这个问题,也许有人可以解释一下.

基本上我使用的许多语言都使用语法糖来编写(使用C++中的语法):

int main() {
    int a = 2;
    a += 3; // a=a+3
}
Run Code Online (Sandbox Code Playgroud)

虽然在lua +=中没有定义,所以我必须写a=a+3,这也是关于语法糖.当使用更"有意义"的变量名称时,例如:bleed_damage_over_time或者它开始变得乏味的东西:

bleed_damage_over_time = bleed_damage_over_time + added_bleed_damage_over_time 
Run Code Online (Sandbox Code Playgroud)

代替:

bleed_damage_over_time += added_bleed_damage_over_time
Run Code Online (Sandbox Code Playgroud)

所以如果你没有一个好的解决方案,我想知道如何解决这个问题,在这种情况下,我当然会有兴趣听到它; 但是为什么lua没有实现这种语法糖.

lua language-design assignment-operator compound-assignment

40
推荐指数
3
解决办法
2万
查看次数

用于在C++中表示JSON的数据类型

我一直试图想出这个问题一段时间了,也许我只是盯着它看了太长时间?

无论如何,手头的问题是找到一种在C++中表示JSON的好方法,在你阅读之前,请注意我对能够使用它的库不感兴趣,所以我想用原始C或C++(C +) +11很好),没有提升,没有libjson我知道他们,并且由于这个问题范围之外的原因我不能(/不会)添加依赖关系.

现在已经解决了,让我告诉你一些关于这个问题的信息,以及我迄今为止所做的一切.

问题是找到一种在C++中表示JSON的好方法,这有点问题的原因是JSON是超松散类型的,而C++实际上是很难输入的.考虑JSON一秒钟,JSON真正能够打字吗?

  • 号码(例如423.1415)
  • 字符串(例如"my string")
  • 数组(例如[],或[1,3.1415,"my string])
  • 对象(例如{}{42, 3.1415, "my string", [], [1,3.1415, "my string]}

那么这意味着有两个"原始"类型,NumberString,以及两个容器类型ArrayObject.原始类型是相当直接的,而容器类型在C/C++中变得棘手,因为它们可以并且可能包含不同类型的元素,因此语言中的任何内置类型都不够,数组不能保持不同类型的元素.这也适用于STL类型(列表,向量,数组等),(除非它们具有多态相等).

所以JSON中的任何容器都可以容纳任何类型的json类型,这几乎就是它的全部内容.

我原型,或尝试过以及为什么它不能工作 我的第一个天真的想法是只使用模板,所以我设置了一个json-object或json-node类型,然后使用模板来决定它里面有什么,所以它会然后有一个像这样的结构:

template <class T>
class JSONNode {
    const char *key;
    T value;
}
Run Code Online (Sandbox Code Playgroud)

虽然这似乎很有希望,但是当我开始使用它时,我意识到当我尝试将节点命令为容器类型(例如数组,矢量,unordered_map等)时,我遇到了麻烦,因为他们仍然想知道JSONNode的类型!如果一个节点被定义为JSONNode<int>另一个节点,JSONNode<float>那么将它们放在容器中会有问题.

所以我走过去了,无论如何我都不是那么有兴趣将它们保存在容器中,我很乐意让它们自我意识或者称它为什么,即广告指向下一个节点,但又一次找出节点的类型变得棘手,而这就是我开始思考多态的时候.

多态性 让我们只创建一个虚拟JSONNode并实现一个JSONNumberNode, JSONStringNode, JSONArrayNodeJSONObjectNode类型,它们将很好地适应我可能想要它们的任何容器,使用多态来让它们都是JSONNodes.

代码的示例可能已到位.

class JSONNode {
public:
    const char *key; …
Run Code Online (Sandbox Code Playgroud)

c++ collections json types c++11

13
推荐指数
2
解决办法
8385
查看次数

GLKit的GLKBaseEffect和自定义着色器

我一直在研究这个问题,而且我似乎无法理解它已经足够解决它所以我认为我不妨把它扔出去并且聪明的一堆可能有一些想法.:P

基本上我一直在研究一个iPhone项目,我有幸使用所有最新的框架和目标5.1.所以我一直在使用GLKit和GLKBaseEffect,这对我来说一直很好.我开始使用GLKBaseEffect而不是编写自己的着色器的原因是我不太了解glsl.然而,要求变得更加精确,基本效果似乎不再削减它.

因为我已经使用基本效果进行了所有变换,所以如果我可以保持基本效果不变,但是如果有意义的话,可以在顶部添加glsl-type着色器.

我的旧方法看起来像这样(这是一个循环渲染所有对象,其中一个对象包含变换,网格和其他一些不太重要的东西,如纹理,材料等)

ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);

[effect prepareToDraw];
[obj render];

effect.transform.modelviewMatrix = modelView;
Run Code Online (Sandbox Code Playgroud)

在这里,我们获取一个对象来渲染和变换(即平移,旋转和缩放)对象,然后我们渲染它,渲染本身获取对象的网格,绑定缓冲区并渲染它.

到现在为止还挺好.

然而,我想要做的是,在[obj render];调用期间,我希望对象也可以执行类似glUseProgram(someProgram);添加更专业的着色器代码的操作.

我想有人可能会争辩说我正在尝试为我的顶点着色器使用基本效果,并希望为我的片段着色器使用"普通"着色器.至少那是我认为我想做的事情.

我一直在尝试一些事情.

我试图创建片段着色器并glUseProgram在其上,但它说我在设置和编译时需要一个顶点和一个片段着色器.我也尝试创建一个空的顶点着色器,但结果并不好,我不知道会发生什么,但我猜它会否决基本效果.

最后,我倾向于接受它可能最好丢掉基本效果并且一直编写我自己的着色器.我觉得窗外有很多工作,所以我想知道我能节省多少钱.

我明白我对着色器的理解是给我带来最大问题的部分,所以请耐心等待.

shader ios glkit

12
推荐指数
2
解决办法
4170
查看次数

C++名称解析

我想知道一点关于namespaceusingC++基本上我想知道差异并弄清楚如何以最好的方式使用它.

我看到它有(至少)三种方法来解决一个类名,我不知道如何选择它们:

  1. using namespace <namespace>
  2. using <namespace>::<what_to_use>
  3. <namespace>::<what_to_use> <use_it>

我想知道优势,特别是如果有一种或另一种方式涉及性能,如果它只是语法和偏好的问题,或者是否有其他事情我没有考虑过这个.

c++ namespaces using

7
推荐指数
2
解决办法
1815
查看次数

如何使用基于Sly Scroller jQuery项的导航?

我试图利用Sly Scroller进行水平滚动。我试图阅读和理解文档,但是我只是不明白如何使用它。

与阅读文档相比,有人可以帮助我入门更简单的示例,甚至可以指定jsfiddle有关该主题的任何实现或教程吗?

jquery sly-scroller

5
推荐指数
1
解决办法
1万
查看次数

C++ 11 unordered_map时间复杂度

我正在试图找出为资源进行缓存的最佳方法.我主要是寻找原生的C/C++/C++ 11解决方案(即我没有提升和喜欢的选项).

从缓存中检索时我正在做的是这样的:

Object *ResourceManager::object_named(const char *name) {
    if (_object_cache.find(name) == _object_cache.end()) {
        _object_cache[name] = new Object();
    }
    return _object_cache[name];
}
Run Code Online (Sandbox Code Playgroud)

在哪里_object_cache定义如下:std::unordered_map <std::string, Object *> _object_cache;

我想知道的是关于这样做的时间复杂性,是否找到触发线性时间搜索或者它是否作为某种查找操作完成?

我的意思是如果我_object_cache["something"];在给定的例子上做它将返回对象或如果它不存在它将调用默认构造函数插入一个不是我想要的对象.我觉得这有点违反直觉的,我本来期望它以某种方式来报告(返回nullptr为例),一个valuekey无法检索,而不是第二个猜测我想要的东西.

但是,再次,如果我find在键上执行操作,是否会触发一个大搜索,实际上它将以线性时间运行(因为找不到键会查看每个键)?

这是一个很好的方法吗,或者是否有人有一些建议,也许有可能使用查找或某些东西来知道密钥是否可用,我可以经常访问,如果是这样的话,有时候是花在搜索上我想消除它,或者至少尽可能快地消除它.

感谢任何关于此的输入.

c++ unordered-map hashmap time-complexity c++11

5
推荐指数
1
解决办法
2530
查看次数

有没有办法在null时自动初始化变量

我在Java中有这个代码:

String foo = request.getParameter("bar");
if (foo == null) { 
    foo = ""; 
}
Run Code Online (Sandbox Code Playgroud)

以这种方式检查了多个值.在其他语言中,我可能会做这样的事情:

String foo = request.getParameter("bar") || "";
Run Code Online (Sandbox Code Playgroud)

我真的只是想知道Java中是否存在等价物.

java variables null initialization

5
推荐指数
2
解决办法
1249
查看次数

更大的项目 Node.js 和 RESTful API

我正在研究node.js,它看起来确实是一个非常好的环境。我使用过许多不同的服务器技术,主要是 php 和 Java (jsp),但也涉足了一些 RoR 和 Python。

我发现 Node.js 非常容易启动和运行,使用起来感觉很自然,而且我发现了一些很好的入门级教程。

我只是缺少一些中间资源。例如,当创建更大的框架或 API 时,您将如何构建或架构它。我设置了一些较小的 api 来尝试它会像这样:

我利用Express 框架创建了一个 http 服务器、侦听端口、设置了一个 Express 对象并绑定了一些请求。

然而,这些规模相当小,而且目的是学习,如果我考虑扩大 API 的规模以进行生产,也许还想做其他事情,比如提供网页服务。我发现很难看出架构会是什么样子。

这很模糊,因为我对 Node.js 还很陌生,但我主要考虑的是诸如是否通常将所有 api 保存在一个文件中,或者是否有好的方法将其拆分为模块?如果有人知道任何资源,更多地讨论如何在使用 Node.js 时设计架构

很抱歉这个模糊的问题,感谢您的阅读。

architecture rest node.js

5
推荐指数
1
解决办法
1175
查看次数

__func__并记录

我正在用C++实现一个日志处理程序,它运行良好,但是有一件事我觉得可以使用,这就是记录器得到输出的地方.

我想这不是一个大问题,但我偶然发现了__func__标识符,它基本上会保留当前函数的函数名称.

所以我在我的Log类中有一个静态函数Write,它需要一个日志级别和一个变化列表.所以我会这样称呼它:

Log::Write(LOG_DEBUG, "this is an integer: %d", 10);
Run Code Online (Sandbox Code Playgroud)

它会打印:

2013-01-02 => 10:12:01.366 [DEBUG]: this is an integer: 10
Run Code Online (Sandbox Code Playgroud)

但是我认为在消息中也有调用者可能有用这样的东西:

2013... => 10:12:... (functionName) [DEBUG]: blah
Run Code Online (Sandbox Code Playgroud)

所以我可以做的(当然)是添加__func__作为参数Log::Write,但这意味着任何时候我打电话Log::Write我也需要发送__func__总是相同的,我觉得应该可以做到没有明确地这样说.

所以我想要的是提供的功能:

Log::Write(LOG_DEBUG, __func__, "message");
Run Code Online (Sandbox Code Playgroud)

无需每次都明确输入func.

我不知道这是否真的可行,我得到的最好的选择是有一些方法可以取消引用函数内部的调用者Write,我似乎不太可能只是"推断"这样的参数.但至少值得一提,也许我可以看看有哪些选择.

谢谢.

c++ logging callstack func

4
推荐指数
1
解决办法
1219
查看次数

C++ 11线程,在主线程上运行

我正在尝试尝试C++ 11线程.我想在异步线程中运行一些代码,当代码完成后,我想在主线程上运行其他代码,但只有当它完成时!

这是因为我想要运行async的东西是加载OpenGL的东西,而且在执行线程时使用OpenGL上下文有点棘手,据我所知,它几乎不会在不同的线程中运行相同的上下文.

但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西真的是解析文件并设置数据和我可以(技术上)在一个单独的线程中做的所有这些然后只是做主线程上的opengl特定任务.(这是我最初的想法,我可能只是以错误的方式去做)..

所以我想如果我可以分离一个线程异步来加载collada文件并填充数据,那么一旦完成,我将调用主线程来绑定缓冲区,设置着色器等等.我可以在没有线程的情况下完成它,但是在没有GL吓坏的情况下在后台加载新数据会非常顺利.

所以我会尝试排列我想要做的步骤:

  1. 主线程绕着做它做的事情......
  2. 有人要求加载新网格
  3. 通过创建异步线程并在其中加载collada数据来初始化网格
  4. 同时主线程继续做它的东西
  5. 一旦collada加载完成,异步线程就会通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等).
  6. 设置完成,网格将自身添加到渲染队列

我确实所有它都是同步工作的,我想要的是一旦分离的异步线程完成后做一些事情的方法.

任何想法或当然是对我思想的建设性批评:P受到热烈欢迎!我可能会以错误的方式思考它,我一直在考虑做一些像观察者模式的事情,但我真的不知道如何以最好的方式解决它.我不介意线程化OpenGL的东西,但它似乎有点像要求麻烦..

c++ opengl asynchronous c++11 stdthread

4
推荐指数
1
解决办法
2355
查看次数

也许我错过了解C++ Exceptions?

我试图围绕异常和更多我想他们能做什么,更重要的是他们应该和不应该做什么.

所以,我将举例说明我如何思考一个非常具体的问题,并希望人们能够保佑或抨击我所拥有的想法.

我正在读取xml文件的设置,所以我可能有设置,但也有特定设置可能不在那里的情况,这会产生一些麻烦和很多"点错误处理"或者叫什么,类型:(观察:这不是"真正的代码",而只是一些伪的东西,希望能说明我的观点).

if (xml.attribute("some_attrib")) {
    settingForSomeAttrib = xml.attribute("some_attrib")->value();
} else {
    settingForSomeAttrib = "some default value";
}
Run Code Online (Sandbox Code Playgroud)

所以这将给我带来一个或多或少的检查和任务 - 我想做的任何事情,这是不可取的.

然后我在思考,或许我可以完成所有操作,取出任何出错的地方并将其交给默认值,稍微尝试一下即可,任何无法解决的问题我们将事后处理.

引导我去 try/catch思考.

我当时在想,也许我可以尝试一下:

try {
    setting1 = xml.attribute("attr1")->value(); // throws some kind of "attr1" exception?
    setting2 = xml.attribute("attr2")->value(); // -||-                "attr2" exception?
} catch (???) {
    //go through the things which went wrong and set them settings straight!
}
Run Code Online (Sandbox Code Playgroud)

希望有某种意义,或者至少可以遵循我的思路.我觉得并不是真的如何使用异常.

我在想,我的问题有点像这样:

1)例外是否可以这样使用或者这只是一个坏主意?2)人们通常如何在C++中使用这些来获取在检查有效性方面并非臃肿的代码?

谢谢.

c++ xml error-handling exception

2
推荐指数
1
解决办法
152
查看次数

三元运算符默认值

我想知道ternary operator主要的内容,C++但我认为它也可能适用于其他语言.

我遇到问题的最好例子,(或者我应该把它称为问题?我猜是一个概念问题.),就是钳位值.

float clamped = (x<0.3) : 0.3 ? x;
Run Code Online (Sandbox Code Playgroud)

我发现自己想要编写这段代码,但x可能很复杂,我们有类似的东西:

float clamped = (1.f - x + my_function()) > .2f ? .2f : (1.f - x + my_function());
Run Code Online (Sandbox Code Playgroud)

在我看来,这是失控的地方,我会重写它:

float clamped = (1.f - x + my_function());
if (clamped > .2f)
    clamped = .2f;
Run Code Online (Sandbox Code Playgroud)

所以这真的导致了两个问题

1:是否有违约行为,所以我可以说"做这个,如果是真的,否则只是做它说的话",伪代码如下: float clamped = (1.f - x + my_function()) > .2f : .2f ? **default**;

2:如果我仍然是第一种方式,它是否会首先评估条件,如果是false,则进行另一次评估以获得值(1.f - x + my_function())

希望它有一些有意义,这是我迄今尚未理解的东西.

c++ ternary-operator clamp

1
推荐指数
1
解决办法
592
查看次数