在C++中,?:运算符比if()... else语句更快?它们在编译代码中有什么区别吗?
我想知道是否存在初始化静态向量的"更好"方式而不是下面的方法?
class Foo
{
static std::vector<int> MyVector;
Foo()
{
if (MyVector.empty())
{
MyVector.push_back(4);
MyVector.push_back(17);
MyVector.push_back(20);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例代码:)
push_back()中的值是独立声明的; 不是数组或其他东西.
编辑:如果不可能,告诉我也:)
可能吗?
template<operator Op> int Calc(int a, b)
{ return a Op b; }
int main()
{ cout << Calc<+>(5,3); }
Run Code Online (Sandbox Code Playgroud)
如果没有,是没有ifs和开关实现这一目标的方法吗?
我有点了解纹理阵列是什么,但在互联网上我无处可找到它们实际上是什么的信息.它们是否像一个大的纹理图集(单个连续的记忆块被划分为相同尺寸的部分),或者它们是否像纹理单元(完全独立的纹理,你可以同时绑定)?这个问题的结果是,单个纹理数组的大小限制是多少,以及如何有效地使用它们?例如,如果我的GPU处理4096x4096纹理和64个单位,我可以创建64个4096x4096纹理的纹理数组吗?或者是每个阵列的实际限制为4096*4096像素?或者别的什么?如何查询限制?
我正在编写一个处理文件和目录的可移植库.我想使用UTF-8作为输入(目录路径)和输出(文件路径).问题是,Windows让我可以选择使用UTF-16-UCS-2和代码页.所以我必须将我的所有UTF-8字符串转换为UTF-16,将它们传递给WinAPI,然后将结果转换回UTF-8.C++ 11似乎<locale>只为此提供了库,除了我所理解的,没有任何预定义的特化使用UTF-8作为内部(即我的)编码 - 最接近的是UTF-16到UTF -8,这与我想要的完全相反.所以这是第一个问题:
1)如何使用codecvt thingamajigs将我的UTF-8字符串转换为UTF-16进行WinAPI调用,UTF-16结果返回UTF-8?
另一个问题:我也在瞄准Linux.在Linux上,对许多不同的语言环境有很好的支持 - 我不希望有任何不同.希望每个人都在他们的Linux机器上使用UTF-8,但没有严格的保证.所以我认为扩展上面特定于Windows的行为并始终执行UTF-8到系统区域设置编码是一个好主意.除了我没有看到在C++ 11的<locale>库中有任何方法来获得当前的系统编码!默认的std :: locale构造函数使用自己定义的语言环境,如果不这样做,它将返回经典的"C"语言环境.并且没有其他我知道的吸气剂.所以这是第二个问题:
2)如何检测当前系统区域设置?什么东西<locale>?也许一些标准的C库函数,或者(在这种情况下可移动性较差)POSIX API中的东西?
我想让一些类使用自动生成的构造函数,但是不可复制(但仍可移动).目前我这样做:
class A
{
public:
A() = default;
A(const A&) = delete;
A(A&&) = default;
A& operator=(const A&) = delete;
A& operator=(A&&) = default;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否真的有必要这么明确.如果我这样写的话怎么办:
class A
{
A(const A&) = delete;
A& operator=(const A&) = delete;
}
Run Code Online (Sandbox Code Playgroud)
它仍然可以工作吗?对于其他情况,最小的默认值和删除集是什么 - 不可复制的非可移动类和具有虚拟析构函数的类?
是否有任何测试代码可用于快速查看隐式创建的构造函数?
我正在使用 OpenGL 制作 2D 游戏。我想做这样的绘图,首先我将要绘制的所有对象的顶点数据复制到 VBO(每个纹理/着色器一个 VBO),然后在单独的绘图调用中绘制每个 VBO。这似乎是一个好主意,直到我意识到它会弄乱绘制顺序 - 绘制调用不一定按照对象加载到 VBO 的顺序进行。我想过使用深度缓冲区对项目进行排序 - 每个要绘制的新对象的 Z 位置都会稍高一些。问题是,我应该增加多少才不会遇到任何问题?AFAIK,可能有两种问题 - 如果我把它设置得太大,那么我可以在一个帧中绘制的对象数量有限,如果我把它设置得太小,深度缓冲区的精度损失可能会导致重叠的图像以错误的顺序绘制。总结一下:
1)我的正投影的前后值应该是多少?0比1?-1比1?1比2?有关系吗?
2) 如果我使用 的 nextafter() 来增加 Z 位置,我会遇到什么样的麻烦?OpenGL 和深度缓冲区如何对次正常浮点数做出反应?如果我从 std::numeric_limits::min() 开始,并以 1 结束,还有什么我应该担心的吗?
我有以下代码:
IntStream.range(0, width).forEach(x1 -> {
IntStream.range(0, height).forEach(y1 -> {
IntStream.rangeClosed(x1-1, x1+1).forEach(x2 -> {
IntStream.rangeClosed(y1-1, y1+1).forEach(y2 -> {
if ((x1 != x2 || y1 != y2) && getNode(x2, y2) != null){
getNode(x1, y1).registerObserverAtNeighbor(getNode(x2, y2));
}
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
有没有办法使用较少的嵌套语句编写上述内容?它基本上是"从(0,0)到(宽度,高度)寄存器观察者的每个节点从(x-1,y-1)到(x + 1,y + 1)的节点,但不是在自身".