我想写一个数学矢量模板.我有一个接受类型和大小作为模板参数的类,有很多数学运算方法.现在我想编写专门化,其中Vector <3>例如x,y,z作为成员分别引用数据[0..3].
问题是我不知道如何创建一个从默认模板继承所有内容的特化,而无需创建基类或编写所有内容两次.
最有效的方法是什么?
template<class Type, size_t Size>
class Vector {
// stuff
};
template<class T>
class Vector<3,T>: public Vector {
public:
T &x, &y, &z;
Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){}
// and so on
};
Run Code Online (Sandbox Code Playgroud) 在未转义字符上拆分字符串的最佳方法是什么?例如.拆分此(原始)字符串
`example string\! it is!split in two parts`
Run Code Online (Sandbox Code Playgroud)
在'!'上,以便生成这个数组:
["example string! it is", "split in two parts"]
Run Code Online (Sandbox Code Playgroud)
std.regex.split
似乎几乎是正确的事情.但是存在一个问题,此代码与正确的拆分字符匹配,但也会消耗左侧部分的最后一个字符.
auto text = `example string\! it is!split in two parts`;
return text.split(regex(`[^\\]!`)).map!`a.replace("\\!", "!")`.array;
Run Code Online (Sandbox Code Playgroud)
拆分时删除整个正则表达式匹配,因此该数组是结果:
["example string! it i", "split in two parts"]
在没有自己迭代字符串的情况下到达第一个数组的最佳方法是什么?
假设我有一个双向链表.我想从中删除一个序列,如下所示:
begin - element - element x element - element - element x element - end
\_________________________________/
-: reference
x: removed reference
Run Code Online (Sandbox Code Playgroud)
我想知道我是否还应删除要删除的元素之间的引用,或者垃圾收集器是否以更好的方式处理它.
目前,我在子像素模式下使用 FreeType,并将每个像素的最大颜色作为 alpha 值,并使用以下片段着色器:
uniform sampler2D Image;
uniform vec4 Color;
smooth in vec2 vVaryingTexCoord;
out vec4 vFragColor;
void main(void){
vec4 color = texture(Image, vVaryingTexCoord);
vFragColor = color * Color;
}
Run Code Online (Sandbox Code Playgroud)
这对于深色背景效果很好,但在浅色背景上会显示边框像素(例如,当文本像素为 (1,0,0) 时)。为了使其适用于更明亮的背景,我需要传递背景颜色并自己进行混合,一旦我转向更复杂的背景,混合就会开始崩溃。
有没有办法使用 FreeType 中的 RGB 值作为纯色的 alpha 值(传递给着色器)?这个公式基本上是这样的,其中 b = 背景像素,t = 当前文本像素,c = 静态颜色:
b*((1,1,1) - t) + t*c.rgb*c.a
Run Code Online (Sandbox Code Playgroud)
我认为先绘制其他所有内容并将帧缓冲区传递给字体着色器会起作用,但这似乎有点过大了。有没有办法在 OpenGL 混合阶段做到这一点?我尝试使用 glBlendFunc 等,但没有取得任何进展。
有没有一种标准方法来复制数组,排除等于对象的元素?我目前天真的解决方案:
T[] without(T)(T[] array, T what){
T[] a;
foreach(element; array)
if(element != what)
a ~= element;
return a;
}
Run Code Online (Sandbox Code Playgroud)
在D中删除数组中的元素似乎不必要地困难,并且不可变的方法看起来相当不错,所以我想创建一个新的而不是修改现有的数组.
std.array.replace
会很好,但它不接受[]
作为第二个论点.
有没有办法__gshared
用DMD 标记所有对象?我正在开发一个游戏引擎,其中几乎所有东西都需要在线程之间共享,而垃圾邮件__gshared
或shared
任何地方都不会削减它.
对于每个希望我不这样做的人:关键部分将是最小的,并减少到检查枚举是否设置为已加载(当然是互斥).所以并发不会让我获得任何东西.