小编Tho*_*mas的帖子

具有共享功能的类模板特化

我正在编写一个带有模板矢量类型的简单数学库:

template<typename T, size_t N>
class Vector {
    public:
        Vector<T, N> &operator+=(Vector<T, N> const &other);
        // ... more operators, functions ...
};
Run Code Online (Sandbox Code Playgroud)

现在我想要一些专门用于其中一些功能的附加功能.比方说,我想要的功能x(),并y()Vector<T, 2>访问特定的坐标.我可以为此创建一个部分特化:

template<typename T>
class Vector<T, 3> {
    public:
        Vector<T, 3> &operator+=(Vector<T, 3> const &other);
        // ... and again all the operators and functions ...
        T x() const;
        T y() const;
};
Run Code Online (Sandbox Code Playgroud)

但现在我正在重复通用模板中已存在的所有内容.

我也可以使用继承.将通用模板重命名为VectorBase,我可以这样做:

template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
};

template<typename T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization

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

返回值的断言函数?

我正在尝试创建一个这样的函数:

function assert<T>(condition: T, msg?: string): T & asserts condition {
  if (!condition) {
    throw new Error(msg)
  }
  return condition
}

Run Code Online (Sandbox Code Playgroud)

目标是回归condition未修改的值,保留其类型,但也通知编译器返回的值是真实的。这将允许它用作独立语句,但也可以在表达式中不引人注目地使用:

const success: bool = true
// ... some code that might set success = false
assert(success)

const element: HTMLElement = assert(document.getElementById('foo'))
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面的语法不起作用( playground)。有没有办法用 TypeScript 来表达这一点?

除了断言函数之外,我找不到任何关于断言函数的官方文档除了TypeScript 3.7 的发行说明,而这些文档仅演示了隐式返回的断言函数void

我能想到的最好的方法是仅针对对象类型的解决方法,因为它们永远不会是错误的:

function assert<T extends object>(condition: T | null | undefined, msg?: string): T {
  if (!condition) {
    throw new Error(msg)
  }
  return condition …
Run Code Online (Sandbox Code Playgroud)

typescript

14
推荐指数
2
解决办法
3977
查看次数

_WinMainCRTStartup执行哪些功能?

这是一系列至少两个密切相关但不同的问题的一部分.我希望我能分别问他们做对了.

我试图让我的Visual C++ 2008应用程序在没有C运行时库的情况下工作.这是一个没有MFC或其他花哨的东西的Win32 GUI应用程序,只是简单的Windows API.

所以我将Project Properties - > Configuration - > C/C++ - > Advanced - > Omit Default Library Names设置为Yes(编译器标志/Zl)并重建.

然后链接器抱怨外部未解决_WinMainCRTStartup.可以说,我可以告诉链接器使用不同的入口点MyStartup.从我在网上收集的内容,_WinMainCRTStartup做一些初始化的东西,我可能想做MyStartup一个子集.

所以我的问题是:如果我不使用CRT,哪些功能可以_WinMainCRTStartup执行,哪些可以省略?

如果您对这些内容有所了解,请查看我的其他问题.谢谢!

旁白:我为什么要首先这样做?

  1. 我的应用程序没有明确使用任何CRT功能.
  2. 我喜欢精益和平均的应用程序.
  3. 它会教我一些新东西.

crt winmain entry-point visual-c++

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

跨平台键盘/鼠标输入推荐

有没有人对一个好的跨平台输入库有任何建议?我想得到:

* at least keyboard and mouse input
* on at least the big three operating systems
* Small/fast
* C or C++
* permissive licensing gpl2/mit/free/etc.
Run Code Online (Sandbox Code Playgroud)

到目前为止我见过:

* OIS (used in Ogre) http://sourceforge.net/projects/wgois/
* SDL (used everywhere it seems, might be a clue) http://www.libsdl.org/index.php
* Allegro http://www.talula.demon.co.uk/allegro/readme.html
Run Code Online (Sandbox Code Playgroud)

有没有人使用过这些,或者知道其他可能有用的东西?

谢谢

c c++ cross-platform input

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

如何在四边形上进行法线的双线性插值?

我正在开发一个类似Minecraft的引擎,作为一个业余爱好项目,看看体素地形的概念可以在现代硬件和OpenGL> = 3上推动多远.因此,我所有的几何都包括四边形或正方形.

我已经建立了一个raycaster来估计环境遮挡,并使用"弯曲法线"技术来进行照明.所以我的法线不垂直于四边形,也没有单位长度; 相反,它们大致指向发生最少遮挡的空间,并且当四边形接收较少光时较短.这种技术的优点是它只需要一次性计算遮挡,并且在渲染时基本上是免费的.

但是,当我尝试将不同的法线分配给同一个四边形的不同顶点以便获得平滑的光照时,我遇到了麻烦.因为四边形被分割成三角形,并且在每个三角形上发生线性插值,所以插值的结果清楚地表明三角形的存在是丑陋的对角线伪影:

在渲染结果中可见对角线

问题是OpenGL在每个三角形上使用重心插值,这是4个角中3个的加权和.理想情况下,我想使用双线性插值,其中所有4个角都用于计算结果.

我可以想到一些解决方法:

  1. 将法线填充为2x2 RGB纹理,让纹理处理器进行双线性插值.这是以片段着色器中的纹理查找为代价的.我还需要将所有这些迷你纹理打包成更大的纹理以提高效率.

  2. 使用顶点属性将所有4个法线附加到每个顶点.还将一些[0..1]系数附加到每个顶点,非常类似于纹理坐标,并在片段着色器中进行双线性插值.这是以将4个法线传递给着色器而不是仅仅1来为代价的.

我认为这两种技术都可以发挥作用,但它们让我觉得它应该更简单.也许我可以以某种方式转换法线,因此OpenGL的插值会产生一个不依赖于所使用的特定三角测量的结果.

(请注意,问题并非特定于法线;它同样适用于需要在四边形中平滑插值的颜色或任何其他值.)

有什么想法可以解决这个问题吗?如果没有,上述两种技术中哪一种最好?

opengl interpolation glsl

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

是否有可能从Meteor建立一个无头的基于节点的客户端?

我正在开发一个系统,通过Meteor应用程序控制远程机器(连接到投影仪和其他一些硬件).目前,我们正在使用用C++编写的本土DDP客户端来实现这一目标,但这种方法并不像我想的那样灵活:

  • C++和JavaScript之间存在重复.
  • 升级很难,因为我们不能同时部署服务器和客户端,所以我们总是要考虑向后兼容性和排序.

所以我想要用JavaScript重写C++应用程序的Meteor部分.理想情况下,我希望有一个特殊的客户端(称之为headless,类似于serverclient):

  • 与Meteor应用程序的其余部分构建在同一个源中,因此我们可以重用与服务器和Web客户端相同的业务逻辑,
  • 在客户端计算机上的Node.js中运行,以便它可以访问操作系统,并且
  • 不包含任何浏览器代码,但添加了一些特定于控制机器和与C++应用程序通信的其他代码.

如果这个客户端不包含任何实际代码,只是一段引导代码,那就更好了.引导程序将从服务器下载实际的应用程序代码,并在更新服务器时重新下载它,其方式与HTML客户端相同.这会使更新变得更容易,因为我们可以假设服务器和客户端始终运行相同的版本.

这样的事情存在吗?如果没有,如果没有不合理的努力,我能有多接近?搜索"流星无头客户端"和"流星节点客户端"对我没有帮助,我能找到的唯一有点相关的问题没有得到很好的解答.

node.js meteor

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

使用反射测试在C#中引发事件的单元

我想测试设置某个属性(或更一般地,执行一些代码)会在我的对象上引发某个事件.在这方面我的问题类似于单元测试,在C#中引发一个事件,但我需要很多这些测试而且我讨厌样板.所以我正在寻找一种更通用的解决方案,使用反射.

理想情况下,我想做这样的事情:

[TestMethod]
public void TestWidth() {
    MyClass myObject = new MyClass();
    AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}
Run Code Online (Sandbox Code Playgroud)

为了实现AssertRaisesEvent,我来到这里:

private void AssertRaisesEvent(Action action, object obj, string eventName)
{
    EventInfo eventInfo = obj.GetType().GetEvent(eventName);
    int raisedCount = 0;
    Action incrementer = () => { ++raisedCount; };
    Delegate handler = /* what goes here? */;

    eventInfo.AddEventHandler(obj, handler);
    action.Invoke();
    eventInfo.RemoveEventHandler(obj, handler);

    Assert.AreEqual(1, raisedCount);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我的问题在于Delegate为此事件创建适当的类型.代理除了调用之外什么都不做incrementer.

由于C#中的所有语法糖浆,我对委托和事件如何工作的概念有点模糊.这也是我第一次涉足反思.丢失的部分是什么?

c# reflection events delegates unit-testing

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

定点算法值得我麻烦吗?

我正在研究一种应该实时运行的流体动力学Navier-Stokes求解器.因此,表现很重要.

现在,我正在研究一些紧密的循环,每个循环占执行时间的很大一部分:没有单一的瓶颈.这些循环中的大多数都进行了一些浮点运算,但是它们之间存在很多分支.

浮点运算主要限于加法,减法,乘法,除法和比较.所有这些都是使用32位浮点数完成的.我的目标平台是x86,至少有SSE1指令.(我在汇编器输出中验证了编译器确实生成了SSE指令.)

我正在使用的大多数浮点值具有相当小的上限,而接近零值的精度并不是非常重要.所以我想到了这样的想法:也许转换到定点算法会加快速度?我知道唯一可以确定的方法是测量它,可能需要数天,所以我想事先了解成功的可能性.

在Doom的时代,定点已经风靡一时,但我不确定它在2010年的位置.考虑到现在有多少芯片被用于浮点性能,是否有可能定点运算仍然存在给我一个显着的速度提升?有没有人有任何可能适用于我的情况的实际经验?

floating-point performance x86 fixed-point

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

在哪里放置BOOST_CLASS_EXPORT用于boost :: serialization?

我正在尝试序列化指向多态类的指针Shape.所以我需要使用BOOST_CLASS_EXPORT来为每个子类定义一个GUID.问题:在哪里放?

让我先展示一个最小的测试用例:

shapes.hpp

#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>

class Shape {
    friend class boost::serialization::access;

    template<typename Archive>
    void serialize(Archive &ar, unsigned int const version) {
        // nothing to do
    }

    public:
        virtual ~Shape() { }
};

class Rect : public Shape {
    friend class boost::serialization::access;

    template<typename Archive>
    void serialize(Archive &ar, unsigned int const version) {
        ar & boost::serialization::base_object<Shape>(*this);
    }

    public:
        virtual ~Rect() { }
};

#ifdef EXPORT_IN_HEADER
    BOOST_CLASS_EXPORT(Rect)
#endif
Run Code Online (Sandbox Code Playgroud)

export.cpp

#include <boost/serialization/export.hpp>
#include "shapes.hpp"

#ifdef …
Run Code Online (Sandbox Code Playgroud)

c++ boost-serialization

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

如何制作美丽的汤输出HTML实体?

我正在尝试清理和XSS证明来自客户端的一些HTML输入.我正在使用Python 2.6和Beautiful Soup.我解析输入,剥离不在白名单中的所有标签和属性,并将树转换回字符串.

然而...

>>> unicode(BeautifulSoup('text < text'))
u'text < text'
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来不像是有效的HTML.使用我的标签剥离器,它打开了各种各样的肮脏的方式:

>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>
Run Code Online (Sandbox Code Playgroud)

这些<script></script>对将被删除,剩下的不仅是XSS攻击,甚至是有效的HTML.

The obvious solution is to replace all < characters by &lt; that, after parsing, are found not to belong to a tag (and similar for >&'"). But the Beautiful Soup documentation only mentions the parsing of entities, not the producing of them. Of course I can run a replace over all NavigableString nodes, but …

html python xss beautifulsoup

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