小编roz*_*zzy的帖子

C++项目组织(使用gtest,cmake和doxygen)

我是一般编程的新手,所以我决定从C++中创建一个简单的向量类开始.但是我想从一开始就养成良好的习惯,而不是稍后尝试修改我的工作流程.

我目前只有两个文件vector3.hppvector3.cpp.随着我对一切事物越来越熟悉,这个项目将慢慢开始增长(使其更像是一般的线性代数库),因此我希望采用"标准"项目布局,以便以后更轻松.所以在环顾四周后,我发现了两种组织hpp和cpp文件的方法,第一种方法是:

project
??? src
    ??? vector3.hpp
    ??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)

第二个是:

project
??? inc
?   ??? project
?       ??? vector3.hpp
??? src
    ??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)

你会推荐哪个?为什么?

其次,我想使用Google C++测试框架对我的代码进行单元测试,因为它看起来相当容易使用.你认为在我的代码捆绑这一点,例如inc/gtestcontrib/gtest文件夹?如果捆绑了,您是否建议使用fuse_gtest_files.py脚本来减少数量或文件,或保留原样?如果没有捆绑,这个依赖是如何处理的?

在编写测试时,这些测试通常是如何组织的?我想为每个类创建一个cpp文件(test_vector3.cpp例如),但是所有编译成一个二进制文件,以便它们可以轻松地一起运行?

由于gtest库通常是使用cmake和make构建的,所以我认为我的项目也可以像这样构建吗?如果我决定使用以下项目布局:

??? CMakeLists.txt
??? contrib
?   ??? gtest
?       ??? gtest-all.cc
?       ??? gtest.h
??? docs
?   ??? Doxyfile
??? inc
?   ??? project
?       ??? vector3.cpp
??? src
?   ??? vector3.cpp
??? test
    ??? test_vector3.cpp
Run Code Online (Sandbox Code Playgroud)

如何CMakeLists.txt才能看到它只能构建库或库和测试?我也见过很多有a build和a …

c++ doxygen cmake googletest

115
推荐指数
4
解决办法
4万
查看次数

Python只枚举反向索引

我试图扭转所给出的索引,enumerate同时保留列举的列表的原始顺序.

假设我有以下内容:

>> range(5)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

如果我列举这个,我会得到以下内容:

>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
Run Code Online (Sandbox Code Playgroud)

但是我想要反转枚举提供的索引,以便得到:

[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下代码:

reversed(list(enumerate(reversed(range(5)))))
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有更简洁的方法来做到这一点?

python reverse enumerate python-3.x

18
推荐指数
4
解决办法
2万
查看次数

C++中类型的单位

C++ Core Guidlines P.1 change_speed示例中,它显示了一个Speed使用的类型,如下所示:

change_speed(Speed s); // better: the meaning of s is specified
// ...
change_speed(2.3); // error: no unit
change_speed(23m / 10s); // meters per second
Run Code Online (Sandbox Code Playgroud)

我对这个例子的最后两行特别感兴趣.第一个似乎暗示如果你没有提供带有参数的单位change_speed就会抛出一个错误.最后一行显示使用一些ms文字定义的单位.现代版C++中是否都有这些新功能?如果是这样,将如何实现这样的东西,以及需要什么版本的C++?

c++ cpp-core-guidelines

17
推荐指数
1
解决办法
1981
查看次数

使用gtest和cmake/ctest时没有找到测试

我有一个具有以下结构的项目:

linalg
??? build
??? CMakeLists.txt
??? docs
?   ??? Doxyfile
??? include
?   ??? linalg
?       ??? vector3.hpp
??? src
?   ??? CMakeLists.txt
?   ??? linalg
?       ??? vector3.cpp
??? test
    ??? CMakeLists.txt
    ??? linalg
        ??? test_vector3.cpp
Run Code Online (Sandbox Code Playgroud)

文件test_vector3.cpp是一个gtest单元测试文件,它提供了两个简单的测试.顶级CMakeLists.txt只是设置包含并添加src和test子目录:

cmake_minimum_required(VERSION 2.8)

project(linalg)

include_directories(include)
add_subdirectory(src)
add_subdirectory(test)
Run Code Online (Sandbox Code Playgroud)

src/CMakeLists.txt文件将vector3.cpp编译为静态库:

cmake_minimum_required(VERSION 2.8)

add_library(linalg linalg/vector3.cpp)
Run Code Online (Sandbox Code Playgroud)

test/CMakeLists.txt文件基于/usr/share/cmake-2.8/Modules/FindGTest.cmake中提供的示例:

cmake_minimum_required(VERSION 2.8)

enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(test_vector3 linalg/test_vector3.cpp)
target_link_libraries(test_vector3 linalg ${GTEST_BOTH_LIBRARIES} pthread)

add_test(test_vector3 test_vector3)
Run Code Online (Sandbox Code Playgroud)

然后我运行以下内容:

cd build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)

我将liblinalg.a库正确编译到build/src中,并在构建/测试中正确编译了test_vector3可执行文件.我可以运行test_vector3可执行文件,我从googletest获得输出,说所有测试都已通过,但是如果我运行make test我没有输出任何输出,如果我运行,ctest ..我得到一条消息说:

Test project …
Run Code Online (Sandbox Code Playgroud)

cmake googletest ctest

11
推荐指数
1
解决办法
5662
查看次数

使用mplot3d在matplotlib中的箭头

我正在尝试使用matplotlib在此页面上重新创建图表:http://books.google.co.uk/books? id = sf9Qn9MS0ykC&p = PA18

这是我到目前为止:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d

class Arrow3D(FancyArrowPatch):
    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)
        self._verts3d = xs, ys, zs

    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))
        FancyArrowPatch.draw(self, renderer)

def Rx(phi):
    return np.array([[1, 0, 0],
                     [0, np.cos(phi), -np.sin(phi)],
                     [0, …
Run Code Online (Sandbox Code Playgroud)

python matplotlib mplot3d

11
推荐指数
1
解决办法
2501
查看次数

如果vector是特定长度,则使用C++ 11 std :: enable_if启用成员函数

我正在编写一个简单的向量类,我希望有一些成员函数只能在某些长度的向量中使用(例如,3元素向量的交叉乘积).我偶然发现了std :: enable_if,看起来它可能能够做我想要的,但我似乎无法让它正常工作.

#include <iostream>
#include <type_traits>

template<typename T, unsigned int L>
class Vector
{
    private:
        T data[L];

    public:
        Vector<T,L>(void)
        {
            for(unsigned int i = 0; i < L; i++)
            {
                data[i] = 0;
            }
        }

        T operator()(const unsigned int i) const
        {
            return data[i];
        }

        T& operator()(const unsigned int i)
        {
            return data[i];
        }

        Vector<typename std::enable_if<L==3, T>::type, L> cross(const Vector<T,L>& vec2) const
        {
            Vector<T,L> result;

            result(0) = (*this)(1) * vec2(2) - (*this)(2) * vec2(1);
            result(1) = (*this)(2) * vec2(0) …
Run Code Online (Sandbox Code Playgroud)

c++ enable-if

8
推荐指数
1
解决办法
3496
查看次数

将C++模板限制为基本类型

我有一个类,它基本上是一个double的包装器,允许它的值被强制为静态值:

class ModelParameter
{
    protected:
        double val;
        bool isForced;
        double forcedVal;

    public:
        ModelParameter(void);
        ModelParameter(double value);
        double getValue(void);
        void setValue(double value);
        bool getIsForced(void);
        void forceValue(double value);
        void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)

但我希望能够将它用于任何原始类型,而不仅仅是双打.如果我像这样重新定义它:

template <class T>
class ModelParameter
{
    protected:
        T val;
        bool isForced;
        T forcedVal;

    public:
        ModelParameter(void);
        ModelParameter(T value);
        T getValue(void);
        void setValue(T value);
        bool getIsForced(void);
        void forceValue(T value);
        void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)

这意味着可以使用任何类型,无论它是否是原始的.有没有什么办法可以限制模板中使用的类型只使用原始类型?

c++ templates

7
推荐指数
2
解决办法
2816
查看次数

免费的UML工具,具有c ++代码生成和doxygen支持

我知道代码生成和doxygen支持等功能通常被认为是商业性的,但我想知道是否有任何支持c ++代码生成的免费UML工具支持doxygen文档?

生成带有文档的模型非常有用,而不必重复/编辑它以启用doxygen支持.

编辑:忘了提我在Linux下开发(Ubuntu)

c++ uml doxygen

6
推荐指数
2
解决办法
2万
查看次数

设置BS3 input-group-addon的宽度

设置BS3 input-group-addon元素的宽度时,我遇到了一些麻烦,这些元素都是前置并附加到文本输入的.在这种情况下,input-group-addon元素的宽度设置正确,但文本输入的宽度不再填充容器的宽度.但是,如果这些只是一个前置或附加的输入组插件,设置宽度按预期工作,请参阅http://jsfiddle.net/asZXU/作为示例.

如何设置BS3 input-group-addon元素的宽度,这些元素已经预先添加到文本输入并附加到文本输入,并且文本输入仍然填充容器的剩余宽度?

注意:我只style="width: 55px;在小提琴中设置input-group-addon元素的宽度,以便能够演示所有变体.我希望能够通过以下方式设置宽度:

.input-group-addon {
    width: 55px;
}
Run Code Online (Sandbox Code Playgroud)

twitter-bootstrap-3

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

在Windows 10上使用nuwen MinGW的C ++ 17文件系统

我想尝试在C ++ 17的新的文件系统库,因此试图复制从cppreference.com的std ::文件系统::例子的current_path并使用最新版本(16.0)编译它MinGW的分布从nuwen.net上我的Windows 10 x64计算机。其中包括gcc v8.1,根据cppreference.com编译器支持页面,该文件应支持文件系统库。

这是我要编译的代码:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    std::cout << "Current path is " << fs::current_path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

和我正在使用的编译器命令:

g++ -std=c++17 filesystem_test.cpp
Run Code Online (Sandbox Code Playgroud)

这是我尝试编译时遇到的错误:

In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
                 from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h: In member function 'std::filesystem::__cxx11::path& std::filesystem::__cxx11::path::operator/=(const std::filesystem::__cxx11::path&)':
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:47: error: no match for 'operator!=' (operand types are 'std::filesystem::__cxx11::path' and 'std::filesystem::__cxx11::path')
    || (__p.has_root_name() && __p.root_name() != root_name()))
                               ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
In file included from c:\mingw\include\c++\8.1.0\iosfwd:40,
                 from …
Run Code Online (Sandbox Code Playgroud)

c++ mingw-w64 windows-10 c++17 gcc8

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