标签: guideline-support-library

我应该用GSL跨度替换(void*,size)吗?

假设我有

int foo(void* p, size_t size_in_bytes);
Run Code Online (Sandbox Code Playgroud)

并假设foo打字是没有意义的.我想成为一名优秀的程序员并应用C++核心指南.具体来说,我想使用跨度而不是(*,len)对.好吧,span<void>不会编译(不能添加到a void *); 和/ span<char>span<uint8_t>等等意味着foo实际上期望chars,它可能不会.

那么我应该span<something-with-size-1>在这种情况下使用,还是坚持使用void*

c++ guideline-support-library

5
推荐指数
2
解决办法
1004
查看次数

如何使用 gsl::span 并指示所有权?

我想写一个函数:

  1. 接受一个指针作为参数
  2. 以长度作为参数
  3. 拥有指针指向的内存(例如,它可能会释放它,或者在某些数据结构中为其构造一个 unique_ptr 等)

现在,如果我想要 1+2,我就会使用gsl::span. 如果想要 1+3 我会使用owner<T*>. 但当我想要这三个时我该怎么办?我应该通过吗owner<gsl::span<T>>?还有别的事吗?

笔记:

  • 您可能不会假设指针位于堆中。
  • std::vector要求太多。该函数不应该要求调用者构造一个std::vector.

c++ cpp-core-guidelines guideline-support-library

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

我应该返回gsl :: span <const T>而不是const std :: vector <T>&

我有一个带有std :: vector <int>成员的类和一个返回对该向量的const引用的成员函数.

class demo {
public:
    //...

    const std::vector<int> & test() const {
        return iv;
    }

private:

    std::vector<int> iv;
};
Run Code Online (Sandbox Code Playgroud)

我计划将成员类型更改为不同的数组,如容器类型,具有足够的功能和更小的内存占用(例如std :: experimental :: dynarray,std :: unique_ptr <int []>).因此,我认为不将真实容器作为const引用返回,而是将视图作为gsl :: span <const int>返回给元素是个好主意.

class demo {
public:
    //...

    gsl::span<const int> test() const {
        return iv;
    }

private:

    std::vector<int> iv;
};
Run Code Online (Sandbox Code Playgroud)

但这会破坏使用const vector <int>的代码,因为同一个未修改的向量的两个span实例不能用于迭代元素:

demo d;

std::cout << (d.test().begin() == d.test().begin()) << "\n";
std::cout << (d.test().end() == d.test().end()) << "\n";

for( auto it = d.test().begin(), end = d.test().end(); it …
Run Code Online (Sandbox Code Playgroud)

c++ cpp-core-guidelines guideline-support-library

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

如何正确安装包含GSL的标头(准则支持库)

// include/MyLib/MyModel.h

#include <memory>
#include <string>
#include "myEntity.h"
#include <gsl/gsl>

class MyModel {
    public:
        std::unique_ptr<MyEntity> load(std::string id);
        bool store(gsl::not_null<MyEntity*> entity); // <---
}
Run Code Online (Sandbox Code Playgroud)

 

# CMakeLists.txt

# `git submodule add https://github.com/Microsoft/GSL.git dependency/gsl`
add_subdirectory(dependency/gsl EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} INTERFACE GSL)

include(GNUInstallDirs)
install(
    DIRECTORY ${CMAKE_SOURCE_DIR}/include/
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
# other install and CMake package stuff...
Run Code Online (Sandbox Code Playgroud)

之后make install我有我的库和头安装

/usr/local/lib/libMyLib.so.1.0.0
/usr/local/lib/libMyLib.so.1
/usr/local/lib/libMyLib.so
/usr/local/include/MyLib/MyModel.h
/usr/local/lib/cmake/MyLib/MyLib.cmake
/usr/local/lib/cmake/MyLib/MyLib-noconfig.cmake
/usr/local/lib/cmake/MyLib/MyLibConfig.cmake
/usr/local/lib/cmake/MyLib/MyLibConfigVersion.cmake
Run Code Online (Sandbox Code Playgroud)

 

/usr/local/lib/libMyLib.so.1.0.0
/usr/local/lib/libMyLib.so.1
/usr/local/lib/libMyLib.so
/usr/local/include/MyLib/MyModel.h
/usr/local/lib/cmake/MyLib/MyLib.cmake
/usr/local/lib/cmake/MyLib/MyLib-noconfig.cmake
/usr/local/lib/cmake/MyLib/MyLibConfig.cmake
/usr/local/lib/cmake/MyLib/MyLibConfigVersion.cmake
Run Code Online (Sandbox Code Playgroud)

客户将使用以下库:

# /usr/local/lib/cmake/MyLib/MyLibConfig.cmake

get_filename_component(MyLib_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)

set( MyLib_INCLUDE_DIR  "/usr/local/include" ) …
Run Code Online (Sandbox Code Playgroud)

c++ cmake c++11 cpp-core-guidelines guideline-support-library

5
推荐指数
0
解决办法
754
查看次数

gsl::string_span 和 std::string_view 有何不同?

据我所知,gsl::string_spanstd::string_view似乎有本质上使用的同一个道理。真的是这样吗?如果是这样,它们实际上是否相同?如果不是 - 它们有什么不同?

相关问题:`gsl::string_span` 的目的是什么?

string-view guideline-support-library string-span

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

使用cmake将依赖项传播到仅头文件的ExternalProject

我正在尝试使用CMake(Microsoft/GSL)构建一个仅限标头的库,这样我就可以使用变量GSL_INCLUDE_DIRSGSL_LIBRARIES链接到目标并传播适当的依赖项.

我正在研究的项目有一个TON子目录,所有外部项目都建在自己的子目录中,因此变量很重要.

我正在使用CMake 3.2.3

通常(对于具有实际.lib或.a的库),我会执行以下操作:

SET(TARGET_NAME gsl)

include(ExternalProject)
ExternalProject_Add(
    ${TARGET_NAME}-ext
    URL "http://target/url"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)   # download/unzip the header-only project

# Specify include dir
SET(${TARGET_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include CACHE STRING "${TARGET_NAME} include directory")

# Library
add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL)
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES 
    IMPORTED_LOCATION "some/path/to/some/lib"
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
SET(${TARGET_NAME}_LIBRARIES ${TARGET_NAME} CACHE STRING "${TARGET_NAME} library location")

MARK_AS_ADVANCED(${TARGET_NAME_UPPER}_DIR ${TARGET_NAME_UPPER}_INCLUDE_DIRS ${TARGET_NAME_UPPER}_LIBRARIES)
Run Code Online (Sandbox Code Playgroud)

这里的问题是只有头文件库没有lib来设置导入的路径,所以我不能使用IMPORTED库.如果我根本不使用库,那么我无法在GSL的其他模块中设置依赖关系,而无需每次都构建(即下载/解压缩),这是我不想做的.一个custom_target会有同样的问题,所以这是一个禁忌.

我想我想要的是一个接口库,就像

add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
Run Code Online (Sandbox Code Playgroud)

但随后cmake抱怨说

3rdParty/gsl/CMakeLists.txt上的CMake错误:33(add_dependencies):add_dependencies无法将目标级依赖项添加到INTERFACE库目标"gsl".

有没有我可以使用接口库(或其他东西)传播外部项目的依赖?

c++ cmake guideline-support-library

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

窄播有什么作用?

我看到一个代码,使用narrow_cast这样的

int num = narrow_cast<int>(26.72);
cout << num;
Run Code Online (Sandbox Code Playgroud)

问题是我的编译器说:

'narrow_cast' was not decleared in this scope. 
Run Code Online (Sandbox Code Playgroud)

我应该定义narrow_cast自己还是我使用错误的方式或者没有类似的东西narrow_cast

c++ guideline-support-library

3
推荐指数
2
解决办法
3102
查看次数