小编Con*_*tin的帖子

如何在C++中切换2个函数集?

有没有办法,我可以有效地在两个相似的功能集(C/C++)之间切换?为了更好地解释我的意思,让我说我有两组全局函数,如:

void a_someCoolFunction();
void a_anotherCoolFunction(int withParameters);
…

void b_someCoolFunction();
void b_anotherCoolFunction(int withParameters);
…
Run Code Online (Sandbox Code Playgroud)

我希望能够在运行时"切换"我的程序中使用哪一个.但是:我不想在每个功能上都有一个条件,例如:

void inline someCoolFunction(){
    if(someState = A_STATE){
        a_someCoolFunction();
    }else{
        b_someCoolFunction();
    }
}
Run Code Online (Sandbox Code Playgroud)

因为,我希望在我的主循环中调用每个函数 - 所以如果我可以做这样的事情(在我的mainloop的开头或someState被更改时)会更好:

if(someState = A_STATE){
    useFunctionsOfType = a;
}else{
    useFunctionsOfType = b;
}
Run Code Online (Sandbox Code Playgroud)

然后简单地打电话

useFunctionsOfType _someCoolFunction();
Run Code Online (Sandbox Code Playgroud)

我希望它可以理解我的意思......我的背景:我写一个应用程序,这应该能够处理的OpenGL ES 1.1和OpenGL ES 2.0都正常-但我不想写的每一个渲染方法2倍(如:renderOpenGL1()renderOpenGL2()我宁愿只写render()).我已经有类似的方法:glLoadIdentity(); myLoadIdentity();......但需要一种方法在这两种方式之间切换.有没有办法以高效的方式实现这一目标?

c c++ performance function

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

在字符串实现中找到最大的回文

我正在尝试解决一个问题,要求在一个字符串中找到最多20,000个字符的最大回文.我试图检查每个子字符串是否是回文,这是有效的,但显然太慢了.经过一番谷歌搜索后,我发现了这个很好的算法 http://stevekrenzel.com/articles/longest-palnidrome.我试图实现它,但我不能让它工作.给定的字符串也包含非法字符,因此我必须将其转换为合法字符并输出最长的回文并包含所有字符.

这是我的尝试:

int len = original.length();
int longest = 0;
string answer;

for (int i = 0; i < len-1; i++){

    int lower(0), upper(0);

    if (len % 2 == 0){
        lower = i;
        upper = i+1;
    } else {
        lower = i;
        upper = i;
    }

    while (lower >= 0 && upper <= len){
        string s2 = original.substr(lower,upper-lower+1);
        string s = convert(s2);

        if (s[0] == s[s.length()-1]){
            lower -= 1;
            upper += 1;
        } else {
            if (s.length() > …
Run Code Online (Sandbox Code Playgroud)

c++ string algorithm palindrome

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

用于粒子系统的GLSL PointSprite

我正在使用带有PointSprites的ParticleSystem(受Cocos2D Source的启发).但我想知道如何重建OpenGL ES 2.0的功能

glEnable(GL_POINT_SPRITE_OES);
glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
glPointSizePointerOES(GL_FLOAT,sizeof(PointSprite),(GLvoid*) (sizeof(GL_FLOAT)*2));
glDisableClientState(GL_POINT_SIZE_ARRAY_OES);
glDisable(GL_POINT_SPRITE_OES);
Run Code Online (Sandbox Code Playgroud)

这些在使用OpenGL ES 2.0上下文时生成BAD_ACCESS.我应该每个PointSprite只使用2个TRIANGLES吗?但那可能不是很有效(额外顶点的开销).

编辑:所以,我的建议解决方案的新问题来自:https: //gamedev.stackexchange.com/questions/11095/opengl-es-2-0-point-sprites-size/15528#15528

可以在批量调用中传递许多不同的大小.我想过使用Attribute而不是Uniform,但是我需要总是将PointSize传递给我的着色器 - 即使我没有绘制GL_POINTS.那么,也许是第二个着色器(仅用于GL_POINTS的着色器)?!我不知道在绘制例程中每一帧切换着色器的开销(因为如果使用粒子系统,我自然也想渲染没有pointSize的常规GL_TRIANGLES)......有什么想法吗?

opengl-es glsl point-sprites particle-system

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

片段着色器GLSL纹理,颜色和纹理/颜色

我想完成一个GLSL着色器,它可以对我的顶点对象进行纹理和着色.事实上,它适用于3个案例中的2个:

1)如果我只分配了一个纹理(但没有特定的颜色 - 所以颜色是"白色"),我只是得到一个纹理对象 - 工作

2)如果我有一个纹理和一个颜色分配,我得到一个用该颜色调制的纹理对象 - 工作

3)如果我只分配了颜色但没有纹理,我会得到一个黑色物体 - 不起作用

我的着色器看起来像这样:

varying lowp vec4 colorVarying;
varying mediump vec2 texcoordVarying;
uniform sampler2D texture;

void main(){
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying;
}
Run Code Online (Sandbox Code Playgroud)

我想,如果没有分配纹理,texture2D(...,...)将返回零 - 所以这似乎是问题所在.如果没有分配纹理(在这种情况下,我只想要gl_FragColor = colorVarying;),我可以检查GLSL吗?

"如果"在GLSL着色器中不是一个真正的选项,如果我没有正确理解 - 有任何想法可以实现这一目标吗?或者是否真的有必要为两种情况制作2种不同的着色器?

glsl ios

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

将MinGW与Visual Studio 2010集成(Makefile项目)

我正在尝试使用Visual Studio 2010的MinGW(版本4.7.2)来使用一些新的C++ 11功能(遗憾的是我仍然使用WindowsXP并且不能使用Visual Studio 2012).首先,我创建了一个项目:File - > New Project - > Visual C++ - > General - > Makefile-Project

General:
Build Command Line: mingw32-make.exe
Rebuild All Command Line: mingw32-make.exe rebuild all
Clean Command Line: mingw32-make.exe clean all

IntelliSense:
Include Search Path: C:\MinGW\lib\gcc\mingw32\4.7.2\include\c++;C:\MinGW\include;
Assembly Search Path: C:\MinGW\lib\gcc\mingw32\4.7.2;C:\MinGW\lib;
Additional Arguments: -std=c++11
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含内容的makefile:

all:
    g++ -std=c++11 -pthread -o Makefile_Test.exe main.cpp
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但在Visual Studios编辑器中几乎所有东西都是波浪形的红色.即

std::vector<std::thread> threads;
Run Code Online (Sandbox Code Playgroud)

std::vector - >'错误:命名空间std没有成员向量'

std::thread - >'错误:命名空间std没有成员线程'

甚至 std::cout << "";

std::cout - >'错误:命名空间std没有成员cout'

但是我当然包括了相应的标题:Visual Studio甚至可以找到它们(将光标放在#include - > Ctrl …

c++ mingw visual-studio-2010 makefile-project c++11

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

如果路径随后更改,则cmake/errors上的相对路径

我有一个VS 12解决方案与我自己的项目,这取决于一些依赖项(使用cmake生成的项目文件).我使用cmake生成了这些VS12项目,并将这些项目添加到我的解决方案中(使用相对路径).然后我不得不调整这些项目的输出目录,在我自己的项目可以找到的其他地方构建目标(所以在路径更改后再次运行cmake不能解决我的问题,因为我必须编辑所有项目然后再)).

如果现在解决方案的绝对路径发生变化,解决方案仍然可以找到项目 - 但是在构建时我从cmake收到错误,"旧路径"不存在.

重现我的问题的步骤:

  1. 这里下载cmake项目.
  2. 提取到目录上 C:\cmake
  3. 在名为的目录内创建 C:\cmake\build
  4. 打开命令行然后转到 C:\cmake\build
  5. 执行 cmake ..
  6. C:\cmake目录重命名为C:\cmake2
  7. 打开解决方案 C:\cmake2\build\CMake.sln

会出现一个包含错误的长列表(这里包括完全包含的时间太长) - 所有这些都是因为旧路径"C:\ cmake \"仍在某处使用而导致的.一个例子:

1>------ Build started: Project: ZERO_CHECK, Configuration: Debug Win32 ------
2>------ Skipped Build: Project: RUN_TESTS, Configuration: Debug Win32 ------
2>Project not selected to build for this solution configuration 
1>  Checking Build System
1>  CMake is re-running because C:/cmake/build/CMakeFiles/generate.stamp dependency file is missing.
1>CUSTOMBUILD : CMake error : The source directory "C:/cmake" does …
Run Code Online (Sandbox Code Playgroud)

cmake visual-studio-2013

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

如何使用 SFINAE 的 std::enable_if_t 和 std::is_base_of 检查编译时继承?

我试图在编译时将函数的模板类型限制为特定类及其子类。为了实现这一点,我使用类型特征std::enable_if_tstd::is_base_of如下所示:

template <typename T = std::enable_if_t<std::is_base_of<A, T> > >
Run Code Online (Sandbox Code Playgroud)

但模板仍然使用不属于继承层次结构(即int)的类型进行编译。下面是该问题的 MCVE:

class A {
public:
  A(float a) : a(a) {}
  float a;
};
class B : public A{
public:
  B(float a) : A(a) {}
};

template <typename T = std::enable_if_t<std::is_base_of<A, T> > >
void templateFunction(T a) {

}

int main() {
  templateFunction<A>(A(1.0f)); // OK -> std::is_base_of<A, A>
  templateFunction<B>(B(1.0f)); // OK -> std::is_base_of<A, B>

  templateFunction<int>(1); // Should not compile! int is not a subclass of …
Run Code Online (Sandbox Code Playgroud)

templates sfinae type-traits c++14

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

使用openGL(插值)清楚地缩放Bitmapfont?

我在我的openGL应用程序中加载一个bitmapfont(作为png图像),以固定大小从那里渲染字符.那很有效.但是:如果我想缩小一些较小尺寸的字形,它看起来并不好看.有没有办法 - 不使用预生成的mipmap(我有一大堆几个字符,需要无级的大小)来扩展它更美丽?插值的某种方式还是什么?

目前我使用的是这样的东西(Mac OS X上的C/C++):

glPopMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, texture->getID());
glScalef(0.7f, 0.7f, 0); //scale here a size

{draw vertexes & set texcoords}

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPushMatrix();
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

c++ opengl bitmap-fonts

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

使用纯抽象析构函数从类继承

如果父类具有纯虚拟析构函数,我该如何正确继承它?我有一个头文件(由IBM Rational Rose生成),如下所示:

class MyClass{
protected:
  inline MyClass() {};
  MyClass(const MyClass&);
  MyClass& operator=(const MyClass&);
public:
  inline virtual ~MyClass() = 0;
  virtual void someMethod() = 0;
};
Run Code Online (Sandbox Code Playgroud)

现在我想实现这个纯抽象类 - 即

class MyClassImpl : public MyClass {
public:
  MyClassImpl(){}
  virtual void someMethod() {}
};

int main(int argc, char*argv[]) {
  MyClassImpl impl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但无论我尝试什么(即在MyClassImpl中定义析构函数;虚拟/非虚拟),我都会收到错误消息:error LNK2019: unresolved external symbol "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ) referenced in function "public: virtual __thiscall MyClassImpl::~MyClassImpl(void)" (??1MyClassImpl@@UAE@XZ).

有没有办法在MyClassImpl没有变化的情况下实施MyClass

c++ inheritance abstract-class

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

如何在Visual Studio中多次编译hlsl着色器?

我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 cso 文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于 DirectX 11,但不适用于 DirectX 9,而“/3_0”仅适用于 DirectX 9,但不适用于在 DirectX 11 上。

向 Visual Studio 项目多次添加相同的文件不起作用,我想避免复制 HLSL 源文件,因为它会增加维护工作量和潜在的错误原因。我也无法在 Visual Studio 中创建单独的目标/配置来实现此目的,因为我需要在可执行文件中支持两个 DirectX 版本(可在运行时切换)。

有没有办法在 Visual Studio 中为单个 HLSL 文件指定多个编译(不同的着色器模型和不同的输出文件)?

hlsl directx-11 directx-9 visual-studio-2017

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