小编Nik*_*ond的帖子

使用cmake使用"experimental/filesystem"构建项目

我需要在我的项目中添加一个"experimental/filesystem"标题

#include <experimental/filesystem>
int main() {
    auto path = std::experimental::filesystem::current_path();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我使用-lstdc ++ fs flag并与libstdc ++ fs.a链接

cmake_minimum_required(VERSION 3.7)
project(testcpp)
set(CMAKE_CXX_FLAGS "-std=c++14 -lstdc++fs" )
set(SOURCE_FILES main.cpp)
target_link_libraries(${PROJECT_NAME} /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a)
add_executable(testcpp ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)

但是,我有下一个错误:

CMakeLists.txt上的CMake错误:9(target_link_libraries):无法为目标"testcpp"指定链接库,该链接库不是
由此项目构建的.

但如果我直接编译,它就可以了:

g++-7 -std=c++14 -lstdc++fs  -c main.cpp -o main.o
g++-7 -o main main.o /usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?

c++ cmake c++14

14
推荐指数
1
解决办法
9559
查看次数

从透视切换到正交保持模型的相同视图大小和缩放

我有fov角度 = 60,width= 640 和height= 480 的窗口,near= 0.01 和far= 100 平面,我使用投影矩阵glm::perspective()

glm::perspective(glm::radians(fov),
                              width / height,
                              zNear,
                              zFar);
Run Code Online (Sandbox Code Playgroud)

它运作良好。

然后我想将投影类型更改为正交,但我不知道如何glm::ortho()正确计算输入参数。我尝试了很多方法,但问题是切换到模型对象的正交投影大小后成为另一个。

让我有一个中心在 (0.5, 0.5, 0.5) 和长度大小为 1 的立方体,以及带有 mEye 的相机 (0.5, 0.5, 3),mTarget 在 (0.5, 0.5, 0.5) 和 mUp (0, 1, 0) )。视图矩阵glm::lookAt(mEye, mTarget, mUp) 使用透视投影效果很好。随着glm::ortho(-width, width, -height, height, zNear, zFar)我的立方体成为窗口的中央小的像素。我也试过实现这个变体如何在保持所需对象大小的透视和正交相机之间切换, 但结果(几乎)与以前相同。

那么,第一个问题是如何计算正交参数以保存对象的原始视图大小/相机的位置?

此外,缩放

auto distance = glm::length(mTarget - mEye)
mEye = mTarget - glm::normalize(mTarget …
Run Code Online (Sandbox Code Playgroud)

c++ opengl orthographic perspectivecamera glm-math

7
推荐指数
1
解决办法
1918
查看次数

C++中的循环就像在python中一样(基于范围的)

像python一样在c ++中进行循环的最简单方法是什么?

for i in range(10): #or range(4, 10, 2) etc
    foo(i)
Run Code Online (Sandbox Code Playgroud)

我的意思是像这样简单的一行

for(auto i: range(10)) //or range(4, 10, 2) or range(0.5, 1.0, 0.1) etc
    foo(i);
Run Code Online (Sandbox Code Playgroud)

但不是这样:

std::vector<int> v(10);
std::iota(begin(v), end(v), 0);
for(auto i: v) {
    foo(i);
}
Run Code Online (Sandbox Code Playgroud)

或这个

for(auto i: []{vector<size_t> v(10); return iota(begin(v), end(v), 0), v;}() ) {
    foo(i);         
}
Run Code Online (Sandbox Code Playgroud)

当然,使用这些例子并不难,或者只是for(;;)我希望有一种方法可以在python中简单而简洁地做到这一点。

c++ python range cycle c++11

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

在unique_ptr中使用模板和继承时的重载解析

我有两节课:

class Base {};
class Derived : public Base {};
Run Code Online (Sandbox Code Playgroud)

还有两个重载函数:

void call(std::unique_ptr<Base> op)
{
    std::cout << "First overloading" << std::endl;
}

template<class F>
void call(F f) 
{
    std::cout << "Second overloading" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

用Derived的unique_ptr来称呼它

call(std::make_unique<Derived>());
Run Code Online (Sandbox Code Playgroud)

我希望调用第一个函数,但是调用第二个函数。为什么编译器选择通用函数而不是特定函数?重载解析不支持继承和多态吗?如果是这样,我该如何修复它并调用第一个函数?

c++ overload-resolution

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