有没有办法使自定义强制转换运算符仅在对象为 const 时可用(或仅隐式)?
例子:
class Foo;
class Bar;
class MyClass {
public:
operator Foo() const;
operator Foo() = delete; // this doesn't seem to have any effect
// I also tried explicit operator Foo(); - no change
operator Bar();
};
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果它是 const,我希望MyClass隐式转换为const,但如果它不是 const,则隐式转换为。这是因为存在一对重载函数:FooBar
void f(Foo x);
void f(Bar x);
Run Code Online (Sandbox Code Playgroud)
我希望能够传递MyClassto f,以便根据它是否为 const 选择正确的函数。然而,通过这种方式,我得到了对重载函数的模糊调用。为什么?
int main() {
f(MyClass());
}
Run Code Online (Sandbox Code Playgroud)
重要提示:我知道可以通过将强制转换运算符转换为构造函数来轻松完成这项工作,但不幸的是,Foo、Bar、 和f无法修改。对于上下文,这是解决我的其他问题的一个想法:有没有办法解决这种不明确的隐式强制转换运算符重载?
我想使用 FreeType 用 OpenGL 绘制文本并使其更清晰,我为每个 mipmap 迭代从 FreeType 生成字体纹理。除了一件事,一切都很好。当我这样做时:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
Run Code Online (Sandbox Code Playgroud)
OpenGL 根据文本的大小选择最近的 mipmap,但如果可用大小是 16 和 32,而我想要 22,它会选择 16,使它看起来很糟糕。有没有办法设置它,以便它始终选择最近的较大 mipmap?
我知道我可以在渲染文本以手动设置 mipmap 级别时执行此操作:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (int) log2(1/scale));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (int) log2(1/scale));
Run Code Online (Sandbox Code Playgroud)
但这真的有效吗?这不是完全不需要使用 mipmaps 吗?我可以制作不同的纹理并根据大小选择一种。那么有没有更好的方法来实现这一点?
假设我有一个粗糙结构如下所示的函数:
int aRecursiveFunction(const SomeLargeStructure *a, int x) {
if (end recursion)
return 0;
// ...
if (something that is mostly true)
return aRecursiveFunction(a, x+1)+1;
// ...
SomeLargeStructure copy = *a;
alter(©);
return aRecursiveFunction(©, x);
}
Run Code Online (Sandbox Code Playgroud)
我需要知道的是,出于性能原因,copy在该点之前函数结束的90%的情况下,是否将在堆栈上创建(这是一个大型结构)的空间.或者它实际上甚至不重要?它取决于编译器吗?将此部分作为另一个功能分开是否更好?
谢谢.
编辑:澄清,sizeof(SomeLargeStructure)大约500,它只有基本类型和数组(没有特殊的构造函数或赋值运算符等).
编辑2:好的,结论似乎是堆栈空间可能每次都会被分配,但它不会影响性能.堆栈溢出不是问题,所以关闭.
我正在使用C++编写一个库,其中一部分是我需要的几个OS函数的抽象层.我开始使用Windows API实现它,但计划使用#ifdef等添加对其他平台的支持.
然而,开始成为一个问题的是,包括Windows.h传播到我不需要它的整个代码的其余部分,特别是,因为它是一个库,它也会污染其他人使用的代码它.我不介意Windows API使用命名空间或一些明确的方法来区分其代码,而是#define很多很常见的单词,如small,near,far(小写)和很多函数名称都是也很一般.
所以我真的很想,如果只有我的代码中特定于平台的部分可以访问这些,那么它就不会被包含在其他任何地方.我知道显而易见的解决方案是仅在CPP文件中包含Windows.h,但这并不总是可行的,因为某些特定于平台的数据类型或结构是类成员变量,例如:
class Window {
public:
// ...
private:
HWND handle;
};
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一目标?
谢谢.
在C++中,我们可以直接在if语句中声明变量,并将其值作为条件,例如
if (SubClass *subObject = dynamic_cast<SubClass *>(baseObject)) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我一直认为这是一个“相对”的新特性,最早是在 C++11 中引入的,但是当我试图确认这一点时,我没有找到相关信息,只有 C++17 扩展了语法更进一步。当我尝试用 编译一个最小的例子时-std=c++98,它起作用了。那么这从一开始就是 C++ 的一个特性吗?
所以我在片段着色器中有一个自定义结构,并且是一个统一变量,它是这些结构的数组.它的定义如下:
#version 130
#define MAX_LIGHTS 8
struct Light {
vec3 ambient;
vec3 diffuse;
vec3 specular;
vec4 position;
vec3 direction;
float cutoff;
float exponent;
};
uniform Light lights[MAX_LIGHTS];
Run Code Online (Sandbox Code Playgroud)
现在,我正试图获得这样的统一位置:
glGetUniformLocation(program, "lights[0].ambient");
glGetUniformLocation(program, "lights[0].diffuse");
// etc...
Run Code Online (Sandbox Code Playgroud)
在我的GTX460上一切正常,但在glGetUniformLocationMobility Radeon HD 5650上返回-1,即使着色器编译/链接很好和一切.(这是一个OpenGL 3.1上下文顺便说一句.)
我究竟做错了什么?
编辑:好的,这是完整的着色器(我没有写它,我正在尝试修复朋友的程序).此外,我还在英特尔高清集成图形适配器上测试了它,它也没有问题.
有人问我,为什么这段代码产生一个随机数:
double a = 75.0;
printf("%d\n", a);
Run Code Online (Sandbox Code Playgroud)
我认为原因是4个字节double被解释为整数,但每次运行程序时打印值都不同.所以我开始尝试更多的东西,发现这个:
printf("%d\n", 75.0, 6);
Run Code Online (Sandbox Code Playgroud)
实际上打印出6号.所以我认为编译器试图修复参数,使它们匹配格式字符串,但后来我尝试了这个:
const char *formats[] = { "%d %.1f\n", "%.1f %d\n" };
int whichFormat = 0;
scanf("%d", &whichFormat);
printf(formats[whichFormat&1], 2.5, 7, 1.2);
Run Code Online (Sandbox Code Playgroud)
格式化字符串现在甚至在编译时都不知道,但它仍然以某种方式设法将参数类型与格式化字符串匹配,打印7 2.5或2.5 7根据输入.最后一个值(1.2)未打印.
所有这些都可以在compileonline.com上复制,它声称使用的是GNU GCC 4.8.1.
这里发生了什么?