我试图围绕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 …
我有一个简单的类型列表实现;
template<typename... Ts>
struct Typelist
{
static constexpr size_t count{sizeof...(Ts)};
};
Run Code Online (Sandbox Code Playgroud)
我想用它做的,是生成std::tuple的std::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错了.那么,我如何基于我抛出的类型列表创建类型向量的元组?
我有一个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 呢?
我有一个简单的 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) 我正在尝试创建一个小方块视图的网格,当用户用拇指悬停在它们上面(或在它们上滑动)时,小方块会暂时“弹出”并摇晃。然后,如果他们继续长按该视图,则会打开另一个包含更多信息的视图。
我认为在方形视图上实现拖动手势就足够了,但看起来一次只有一个视图可以捕获拖动手势。
有没有办法启用多个视图来捕获拖动手势,或者一种为 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) 我正在使用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) 我一直在考虑为我的 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) 我一直在研究使用OpenGL编写应用程序来在屏幕上呈现数据,并且有一件事情不断出现 - 将数据复制到GPU中的速度很慢.
我目前正在阅读OpenGL SuperBible第7版和在线阅读各种教程之间切换,而且当数据实际发送到GPU时我没有遇到过,我只是猜测.
glBufferStorage/ 时,是否在GPU的内存中分配了空间glCreateVertexArrays?或者这个空间是在我的应用程序的内存中分配的,然后在以后复制?glMapBuffer*指向GPU内存的指针返回的,还是指向我的应用程序内存中分配的空间的指针,然后在以后复制?glCrawArrays?我遵循了 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) 我正在开发一个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位限制的方法?
我想显示 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) 我正在向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)