小编Bil*_*ias的帖子

建议如何命名"get/create&get"函数

我正在开发一个函数,它通过值(例如,通过名称)从容器(例如数组)返回一个对象.如果该对象尚不存在,则创建并返回该对象的默认副本(默认构造函数).

这样,无论对象在调用函数之前是否存在,该函数总是返回一个对象.

现在我的问题是:如何命名这个功能?GetOrCreateThenGet听起来很愚蠢.有任何想法吗?

编辑:我觉得这样的东西更接近函数的本质:GetForSure ...

naming

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

命名空间和定义之间的冲突

我有这个严重的问题.我在2个名称空间中有一个枚举,如下所示:

namespace FANLib {
namespace ERROR {

    enum TYPE {

        /// FSL error codes
        FSL_PARSER_FILE_IERROR,...
Run Code Online (Sandbox Code Playgroud)

在我的代码中的其他地方,我使用它像这样:

FANLib::Log::internalLog(FSLParser::FILE_IERROR, file_ierror, true, FANLib::ERROR::FSL_PARSER_FILE_IERROR);
Run Code Online (Sandbox Code Playgroud)

所有编译都很好,但如果我碰巧包含"windows.h",我会收到错误!问题出在"WinGDI.h"中,其中包含以下行:

#define ERROR               0
Run Code Online (Sandbox Code Playgroud)

并使编译器认为,在FANLib :: ...之后,有一个零!我得到的错误是:

错误1错误C2589:'常数':'::'右侧的非法令牌

错误2错误C2059:语法错误:'::'

错误3错误C2039:'FSL_PARSER_FILE_IERROR':不是'`global namespace''的成员

我可以做些什么,而不必因为一些不经意而改变我的命名空间#define?我在另一篇文章中读过我可以#undef ERROR,但这有多安全?

c++ namespaces c-preprocessor

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

如果使用 {},函数调用不会产生歧义

#include <stdio.h>
#include <vector>
#include <deque>

// 1st function
void f(int i, int j = 10){
    printf("Hello World what");
};

void f(std::vector<int>){
    printf("Hello World vec");
};

void f(std::deque<int>){
    printf("Hello World deq");
};

int main()
{
    f({});
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果第一个函数被注释掉,我会ambiguous call在编译时得到。如果没有注释掉,则调用第一个函数。为什么{}隐式转换为int?

实例:https : //onlinegdb.com/rkhR0NiBD

c++ initialization curly-braces list-initialization c++17

6
推荐指数
2
解决办法
77
查看次数

尝试优化直线与圆柱相交

我的大脑一直在我一直在研究的线段与圆柱体相交程序中融化。

 /// Line segment VS <cylinder>
 // - cylinder (A, B, r) (start point, end point, radius)
 // - line has starting point (x0, y0, z0) and ending point (x0+ux, y0+uy, z0+uz) ((ux, uy, uz) is "direction")
 // => start = (x0, y0, z0)
 //   dir = (ux, uy, uz)
 //   A
 //   B
 //   r
 //   optimize? (= don't care for t > 1)
 // <= t  = "time" of intersection
 //   norm = surface normal of intersection point …
Run Code Online (Sandbox Code Playgroud)

c++ math 3d optimization intersection

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

std :: set中的函数和方法指针

我的另一个消息中所述,不可能将2个指向成员函数的指针与"<"(小于)进行比较.或者至少,这会导致未定义的行为.

我刚刚设法使用Visual C++和GCC编译此代码:

template <class Receiver, class Param = void*, class Return = void>
class EventReceiver : public IFunction<> {

protected:

    std::set< Return(Receiver::*)(Param) > test;
    std::set< Return(*)(Param) > test2;
...
Run Code Online (Sandbox Code Playgroud)

AFAIK,要创建任何东西的std :: map或std ::,必须可以将集合的值与"<"进行比较.这是否意味着上述容器或实际编译器具有以这种方式比较指针到方法的工作实现?

c++ comparison stl function-pointers set

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

保护Flash AS3代码+与服务器的安全通信

我需要我的Flash客户端安全地与服务器通信(通过二进制套接字).为此,我考虑在AS3代码中嵌入预共享密钥,并通过自定义协议交换XORed数据.

我被告知,SWF反编译器可以很好地使所有嵌入代码清晰可读.这是否意味着我无法隐藏我的钥匙?

如果这种方法不切实际,还有哪些其他选择?我试过as3crypto,却发现它充满了缺点,缺乏严肃的文档.

flash protection data-protection actionscript-3 decompiler

5
推荐指数
0
解决办法
1437
查看次数

函数 std::make_shared&lt;vector&gt; 的参数太多

我错过了一些东西std::make_shared。它不能解决 a 的类型std::initializer_list,还是我做错了什么?

#include <vector>
#include <memory>

class A {};

int main()
{
    A a;
    std::vector<A> veca{A(), A{}, a}; // this works ofc
    std::vector<A> vecb({A(), A{}, a}); // this too

    std::make_shared<std::vector<A>>(vecb); // and this, ofc
    std::make_shared<std::vector<A>>({a}); // what's wrong here?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

main.cpp:21:41: error: too many arguments to function ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = std::vector; _Args = {}]’
     std::make_shared<std::vector<A>>({a});
                                         ^
In file included from /usr/include/c++/6/memory:82:0,
                 from main.cpp:10:
/usr/include/c++/6/bits/shared_ptr.h:632:5: note: declared here
     make_shared(_Args&&... __args) …
Run Code Online (Sandbox Code Playgroud)

c++ vector initializer-list make-shared list-initialization

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

异步屏幕更新到游戏逻辑,C++

我正在使用Visual C++ 2008 Express和Ogre3D sdk编写游戏.

我的核心游戏逻辑设计为每秒100次运行.为简单起见,我会说这是一种叫做"gamelogic()"的方法.它不是基于时间的,这意味着如果我想将游戏时间"提前"1秒,我必须将'gamelogic()'称为100次.与游戏的屏幕渲染相比,'gamelogic()'是轻量级的.

Ogre有一个"监听器"逻辑,可以在代码绘制框架时以及完成绘制框架时通知代码.如果我只是在帧渲染之前调用'gamelogic()',那么游戏玩法将受到屏幕渲染速度的极大影响,屏幕渲染速度可能从5fps到120fps不等.

想到的简单解决方案是:计算自上次渲染帧以来经过的时间,并在下一帧之前多次调用'gamelogic()':100*timeElapsedInSeconds

但是,我认为"正确"的方式是多线程; 有一个单独的线程运行'gamelogic()'100次/秒.

问题是,当两个独立的线程之间存在冲突时,我如何实现这一点以及可以做些什么:当Ogre同时渲染屏幕时,游戏逻辑改变屏幕内容(3d对象坐标).

提前谢谢了.

c++ multithreading asynchronous ogre3d

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

C++返回类型限定符天堂

实际上真是太棒了.有人可以用简单的英语解释为什么下面的部分工作与否?

class Hey;

class Bitmap {

public:
    const Hey* const& getHey() { return hey; }; // works
    const Hey* & getHey2() { return hey; }; // error C2440: 'return' : cannot convert from 'Hey *' to 'const Hey *&'

private:
    Hey* hey;
};
Run Code Online (Sandbox Code Playgroud)

c++ qualifiers return-type visual-c++

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

是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?

我希望在同一个运行线程中选择的时间点永远不相等。那是因为我用时间点来区分不同的计算结果。

伪代码:

StampedResult fn() {
  auto result = Calculations();
  auto time_stamp = std::chrono::steady_clock::now();
  return {time_stamp, result);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果Calculations()总是很复杂,那会自动解决。但有时,Calculations()可能会立即返回。

所以,我想我应该检查 2 个连续调用是否steady_clock::now()可以返回相同的值,如下所示:

https://onlinegdb.com/BkiDAZRe8

onlinegdb.com我的笔记本电脑上,Intel® Core™ i7-8750H CPU @ 2.20GHz我从来没有得到相同的值。但是,在给定steady_clock的纳秒精度下,其他一些超高频处理器真的能返回相同的值吗?

c++ std clock c++-chrono c++14

4
推荐指数
2
解决办法
186
查看次数