小编Aco*_*orn的帖子

C Dirent.h的现代C++包装器

我试图围绕c头dirent.h编写一个现代的c ++包装器.

要读取C中目录的内容,请编写如下内容:

int listdir(const char *path) {
  struct dirent *entry;
  DIR *dp;

  dp = opendir(path);
  if (dp == NULL) {
    perror("opendir");
    return -1;
  }

  while((entry = readdir(dp)))
    puts(entry->d_name);

  closedir(dp);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

把它转换成现代c ++,我有以下内容(其中m_dir和m_dirent是std::unique_ptr,而m_files是a std::vector<string>)

filesystem::Directory::Directory(std::string dir) : m_dir(opendir(dir.c_str()), closedir),
                                                  m_dirent(new struct dirent())
{
    //If the directory can not be read, throw an error.
    if (!m_dir) {
        sdl2::SDLFileSystemRead_Failure ex;
        throw ex;
    }

    while (&(*m_dirent = *readdir(&*m_dir)))
    {

        m_files.emplace_back(std::string(m_dirent->d_name));

    }

}
Run Code Online (Sandbox Code Playgroud)

这只有一半有效.当我写这篇文章时,我不知道我只是在检查表达式的地址是否*m_dirent = *readdir(&*m_dir)存在(当然,它确实存在!).根据单一UNIX®规范版本2 …

c++ pointers c++11

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

从Typelist创建向量元组

我有一个简单的类型列表实现;

template<typename... Ts> 
struct Typelist
{
  static constexpr size_t count{sizeof...(Ts)};
};
Run Code Online (Sandbox Code Playgroud)

我想用它做的,是生成std::tuplestd::vector>在每一个类型串式; 例如:

struct A {};
struct B {};
struct C {};

using myStructs = typelist<A,B,C>;
using myList = tupleOfVectorTypes<myStructs>; tuple<vector<A>, vector<B>, vector<C>>
Run Code Online (Sandbox Code Playgroud)

这就是我一直在玩的:

template<template<typename... Ts> class T>
struct List
{
  using type = std::tuple<std::vector<Ts>...>;
};
Run Code Online (Sandbox Code Playgroud)

然而,它继续吐出它期望的类型.我试过包裹Ts decltype,就像这样:

using type = std::tuple<std::vector<decltype(Ts)>...>;

但那也是错的,我猜我也decltype错了.那么,我如何基于我抛出的类型列表创建类型向量的元组?

c++ templates tuples vector typelist

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

从 hana::tuple_t 到 hana::tuple

我有一个hana::tuple_t<int, char, double, float>,我想用它来创建一个hana::tuple<int, char, double, float>.

我认为使用hana::to<hana::tuple_tag>会将hana::tuple_t<int, char, double, float>变成hana::tuple<int, char, double, float>; 但事实并非如此,因为以下总是失败:

auto oType = hana::tuple_t<int, char, double, float>;

BOOST_HANA_CONSTANT_ASSERT(
    hana::to<hana::tuple_tag>(oType)
    ==
    hana::make_tuple(1, 'C', 1.0, 1.0f)
);
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用hana::transform,但没有运气(尽管我怀疑我做错了):

auto vecs = hana::transform(typeList, [](auto t) {
    return typename decltype(t)::type{};
});
Run Code Online (Sandbox Code Playgroud)

那么,我该如何将 hana::tuple_t 转换为 hana::tuple 呢?

c++ typelist boost-hana

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

获取类型列表中类型的索引

我有一个简单的 TypeList 实现,如下所示:

template<typename... Ts>
struct TypeList
{
    static constexpr std::size_t size{ sizeof... (Ts) };
};

struct T1
    {
    };

struct T2
        {
        };

struct T3
        {
        };

using Types = mpl::TypeList<T1, T2, T3>;
Run Code Online (Sandbox Code Playgroud)

我想找出T2typelist 内部类型的索引Types。这是我目前正在使用的,但是它仅在我搜索的类型位于类型列表的开头时才有效。否则,它编译时会出现错误“ value:未声明的标识符”。

template<typename, typename>
struct IndexOf {};

// IndexOf base case: found the type we're looking for.
template <typename T, typename... Ts>
struct IndexOf<T, TypeList<T, Ts...>>
    : std::integral_constant<std::size_t, 0>
{
};



// IndexOf recursive case: 1 + IndexOf the rest …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming variadic-templates

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

SwiftUI 跨多个子视图拖动手势

我正在尝试创建一个小方块视图的网格,当用户用拇指悬停在它们上面(或在它们上滑动)时,小方块会暂时“弹出”并摇晃。然后,如果他们继续长按该视图,则会打开另一个包含更多信息的视图。

我认为在方形视图上实现拖动手势就足够了,但看起来一次只有一个视图可以捕获拖动手势。

有没有办法启用多个视图来捕获拖动手势,或者一种为 iOS 实现“悬停”手势的方法?

这是我的主要网格视图:

import SwiftUI

struct ContentView: View {
  @EnvironmentObject var data: PlayerData

    var body: some View {
      VStack {
        HStack {
      PlayerView(player: self.data.players[0])
      PlayerView(player: self.data.players[1])
      PlayerView(player: self.data.players[2])
        }

        HStack {
      PlayerView(player: self.data.players[3])
      PlayerView(player: self.data.players[4])
      PlayerView(player: self.data.players[5])
        }

        HStack {
      PlayerView(player: self.data.players[6])
      PlayerView(player: self.data.players[7])
      PlayerView(player: self.data.players[8])
        }

        HStack {
      PlayerView(player: self.data.players[9])
      PlayerView(player: self.data.players[10])
        }
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Square 视图,它将包含一个小摘要以显示在 Square 上:

import SwiftUI

struct PlayerView: View {
  @State var scaleFactor: CGFloat = 1.0
  var player: Player …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

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

传递给函数时,Delphi PChar字符串为空

我正在使用Delpi XE6,如果重要的话.

我正在编写一个DLL,它将从Google的Directions API获得响应,解析生成的JSON并确定行程的总距离.

GetJSONString_OrDie按预期工作.它需要一个网址,并尝试从Google获得回复.如果是,则返回Google返回的JSON字符串.

ExtractDistancesFromTrip_OrDie 应该接受一个JSON字符串,并解析它以获得旅程中每条腿的总距离,并将这些距离固定在一个双打数组中.

SumTripDistances 接受一个双精度数组,并对数组求和,并返回总数.

奇怪的是,如果我从DLL中取出这些函数并将它们放在项目中并像这样调用它,它就会按预期工作.只有当它们陷入DLL时才会出现问题.如上所述,GetJSONString_OrDie作为intened工作并返回一个JSON字符串 - 但是当单步执行DLL时ExtractDistancesForTrip,传递的PChar字符串是''.这是为什么?

unit Unit1;



interface
uses
  IdHTTP,
  IdSSLOpenSSL,
  System.SysUtils,
  System.JSON;

type
  arrayOfDouble = array of double;

function GetJSONString_OrDie(url : Pchar) : Pchar;
function ExtractDistancesForTrip_OrDie(JSONstring: Pchar) : arrayOfDouble;
function SumTripDistances(tripDistancesArray: arrayOfDouble) : double;

implementation



{ Attempts to get JSON back from Google's Directions API }
function GetJSONString_OrDie(url : Pchar) : PChar;
var
  lHTTP: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  {Sets up SSL}
  SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  {Creates …
Run Code Online (Sandbox Code Playgroud)

delphi dll json

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

std::forward 和运算符()

我一直在考虑为我的 C++ 项目编写 static_if ,我偶然发现了以下代码:

#include <iostream>
using namespace std;

namespace static_if_detail {

struct identity {
    template<typename T>
    T operator()(T&& x) const {
        return std::forward<T>(x);
    }
};

template<bool Cond>
struct statement {
    template<typename F>
    void then(const F& f){
        f(identity());
    }

    template<typename F>
    void else_(const F&){}
};

template<>
struct statement<false> {
    template<typename F>
    void then(const F&){}

    template<typename F>
    void else_(const F& f){
        f(identity());
    }
};

} //end of namespace static_if_detail

template<bool Cond, typename F>
static_if_detail::statement<Cond> static_if(F const& f){
    static_if_detail::statement<Cond> if_;
    if_.then(f); …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

何时将数据发送到使用openGL的GPU

我一直在研究使用OpenGL编写应用程序来在屏幕上呈现数据,并且有一件事情不断出现 - 将数据复制到GPU中的速度很慢.

我目前正在阅读OpenGL SuperBible第7版和在线阅读各种教程之间切换,而且当数据实际发送到GPU时我没有遇到过,我只是猜测.

  1. 当我调用glBufferStorage/ 时,是否在GPU的内存中分配了空间glCreateVertexArrays?或者这个空间是在我的应用程序的内存中分配的,然后在以后复制?
  2. 指针是从glMapBuffer*指向GPU内存的指针返回的,还是指向我的应用程序内存中分配的空间的指针,然后在以后复制?
  3. 假设数据存储在我的应用程序内存中并复制到GPU,实际复制的数据是什么时候?我打电话的时候glCrawArrays

c++ opengl

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

使用 MFC 打印到打印机 DC

我遵循了 Microsoft 关于创建设备上下文的教程,并且尝试在互联网上查找合适的来源(显然,MFC 是一个神秘的东西)。以下成功打印出“Hello, World!”;除了它非常小。

如何将 CImage 而不是文本发送到打印机?我怎样才能使文本的大小大于几毫米?我已经搜索过 MSDN,但所有内容要么已经过时(就像我正在使用的示例代码),要么只是没有详细记录。

 // get the default printer
  CPrintDialog dlg(FALSE);
  dlg.GetDefaults();

  // is a default printer set up?
  HDC hdcPrinter = dlg.GetPrinterDC();
  if (hdcPrinter == NULL)
  {
    //MessageBox(_T("Buy a printer!"));
  }
  else
  {
    // create a CDC and attach it to the default printer
    CDC dcPrinter;
    dcPrinter.Attach(hdcPrinter);

    // call StartDoc() to begin printing
    DOCINFO docinfo;
    memset(&docinfo, 0, sizeof(docinfo));
    docinfo.cbSize = sizeof(docinfo);
    docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");

    // if it fails, complain and exit gracefully …
Run Code Online (Sandbox Code Playgroud)

c++ printing mfc

2
推荐指数
1
解决办法
4230
查看次数

分配大于32位的堆内存允许

我正在开发一个32位的OSGEarth项目,我必须将选择的图像拼接成一个大图像.切换到64位不是一种选择.

图像作为256x256图块的集合存储在存储器中.当用户尝试从许多磁贴创建单个映像时,问题就出现了,OSGEarth内部尝试分配的内存比32位系统允许的内存多.

我试图通过分配几个数据块来解决这个限制,每个数据块大小为1025字节.然后,第1025个字节将"指向"下一个块的开头,最后一个字节为nullptr.

这就是我目前正在做的事情(我计划将来分配更多):

unsigned char* start = new unsigned char[1025];
unsigned char** head = &start;
unsigned char** tail = head + 1025;

for (unsigned int i = 0; i < 3; ++i)
{
    auto c = new unsigned char[1025];
    *tail = &c[0];
    tail = &c + 1025;
}

memset(head, 'C', 1025 * 4);
Run Code Online (Sandbox Code Playgroud)

但是,如果我期待发生的事实上正在发生,我有一些保留意见.内存是否真正分配在一个连续的块中?如果没有,那么我的memset正在写未分配的数据,这可能是坏的.

有没有解决32位限制的方法?

c++ memory memory-management openscenegraph

2
推荐指数
1
解决办法
116
查看次数

整数下溢导致模运算失败

我想显示 4 张图像,因此我使用 来unsigned short表示当前图像的索引。当我按A时,索引减1;当我按 D 时,索引增加 1。

image_index = (image_index - 1) % 4;我正在使用(以及 D 按键上的image_index = (image_index + 1) % 4;)计算 A 按键上的索引

如果我向前循环(即,按 D),一切都会按预期工作,但如果我位于索引 0 并按 A,它会下溢到无符号短整型的最大值,并且不会以 4 为模来给出索引3.

我知道对于有符号类型,上溢/下溢是 UB,但我确信对于无符号类型,它是定义良好的。有什么想法可能导致它忽略模数吗?

enum class Errors : short {
  kSdlSuccess = 0,
  kSdlInitFailure = -1,
  kSdlWindowCreationError = -2,
  kSdlRendererCreationError = -3
};

int main(int argc, char** argv) {

  sdl::Context ctx;
  sdl::Window window({ .w = 600, .h = 480, .flags = 0});
  sdl::Renderer renderer(window, {0}); …
Run Code Online (Sandbox Code Playgroud)

c++ modulo underflow undefined-behavior

2
推荐指数
1
解决办法
339
查看次数

无法从StringStream获取字符串

我正在向Google的Map API发送一个HTTP Get请求,并在我的StringStream中填充响应.但是,当我尝试从流中读取时,我只会看到一个空字符串''.

{ Attempts to get JSON back from Google's Directions API }
function GetJSONString_OrDie(url : string) : string;
var
  lHTTP: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
  Buffer: TStringStream;
begin
  {Sets up SSL}
  SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  {Creates an HTTP request}
  lHTTP := TIdHTTP.Create(nil);
  {Sets the HTTP request to use SSL}
  lHTTP.IOHandler := SSL;

  {Set up the buffer}
  Buffer := TStringStream.Create(Result);
  {Attempts to get JSON back from Google's Directions API}
  lHTTP.Get(url, Buffer);

  Result:= Buffer.ReadString(Buffer.Size); //An empty string is put into Result


  finally
    {Frees …
Run Code Online (Sandbox Code Playgroud)

delphi

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