小编Nat*_*eed的帖子

如何创建可由子进程读取的临时文件?

我正在编写一个Python脚本,需要将一些数据写入临时文件,然后创建一个运行C++程序的子进程,该程序将读取临时文件.我正在尝试使用NamedTemporaryFile它,但根据文档,

名称是否可以用于第二次打开文件,而命名的临时文件仍然是打开的,因此不同平台(它可以在Unix上使用;它不能在Windows NT或更高版本上使用).

事实上,在Windows上,如果我在写入后刷新临时文件,但是在我希望它消失之前不要关闭它,子进程无法打开它进行读取.

我正在通过创建文件来解决这个问题,在生成delete=False子进程之前将其关闭,然后在完成后手动删除它:

fileTemp = tempfile.NamedTemporaryFile(delete = False)
try:
    fileTemp.write(someStuff)
    fileTemp.close()
    # ...run the subprocess and wait for it to complete...
finally:
    os.remove(fileTemp.name)
Run Code Online (Sandbox Code Playgroud)

这似乎不优雅.有一个更好的方法吗?也许是一种打开临时文件权限的方法,以便子进程可以获得它?

python windows temporary-files

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

如何编写返回引用数组的C++转换运算符?

在C++中,可以在类或结构中添加隐式转换运算符.例如,3D矢量类型通常包括以下内容:

struct Vector {
    float x, y, z;
    operator float * () { return reinterpret_cast<float *>(this); }
};
Run Code Online (Sandbox Code Playgroud)

允许使用下标访问向量的元素,传递给需要指针等的函数.我想知道:我们可以编写一个转换运算符来返回对float数组的引用,而不是指向float的指针吗?

(这纯粹是学术上的兴趣.我不知道对于一个简单的指针,引用数组会有什么好处,如果有的话.)

作为一个免费功能,我们可以这样做:

float (&convert(Vector & v))[3]
{
    return reinterpret_cast<float(&)[3]>(v);
}

Vector v;
convert(v);
Run Code Online (Sandbox Code Playgroud)

但是,我无法找到正确的语法来执行此操作作为转换运算符.我尝试过这样的事情:

operator float(&)[3] ()
operator float(&())[3]
float (&operator())[3]
Run Code Online (Sandbox Code Playgroud)

和其他各种排列,但我只是得到各种语法错误(g ++ 4.8.1).

是否可以编写一个转换运算符,返回对数组的引用,如果是,那么这样做的语法是什么?

c++ arrays operator-overloading implicit-conversion

11
推荐指数
2
解决办法
3334
查看次数

使用大型静态数组的Visual C++ 2010中的长编译时间

我们有一个C++项目,其中有几个由预处理工具生成并编译到我们项目中的大型静态数据表(结构数组).到目前为止,我们一直在使用VC++ 2008,但是准备进入2010年,这些数据表突然需要很长时间才能编译.

例如,一个这样的表有大约3,000个条目,每个条目都是一个包含几个整数和指针的结构,所有这些都是静态初始化的.这个文件在VC++ 2008中编译需要大约15秒,但在VC++ 2010中需要30 分钟!

作为一个实验,我尝试将此表均匀地分成8个表,每个表都在自己的.cpp文件中,并且每个表在20-30秒内编译.这让我觉得编译器内部的东西在这些表的长度上是O(n ^ 2).

cl.exe平台的内存使用量大约为400 MB(我的机器有12 GB的RAM),一旦它处于高位状态,我看不到任何I/O活动,所以我认为这不是磁盘缓存问题.

有谁知道这里会发生什么?是否有一些编译器功能我可以关闭以恢复正常的编译时间?

以下是表中数据的示例:

//  cid (0 = 0x0)
{
    OID_cid,
    OTYP_Cid,
    0 | FOPTI_GetFn,
    NULL,
    0,
    NULL,
    (PFNGET_VOID) static_cast<PFNGET_CID>(&CBasic::Cid),
    NULL,
    CID_Basic,
    "cid",
    OID_Identity,
    0,
    NULL,
},

//  IS_DERIVED_FROM (1 = 0x1)
{
    OID_IS_DERIVED_FROM,
    OTYP_Bool,
    0 | FOPTI_Fn,
    COptThunkMgr::ThunkOptBasicIS_DERIVED_FROM,
    false,
    NULL,
    NULL,
    NULL,
    CID_Basic,
    "IS_DERIVED_FROM",
    OID_Nil,
    0,
    &COptionInfoMgr::s_aFnsig[0],
},

//  FIRE_TRIGGER_EVENT (2 = 0x2)
{
    OID_FIRE_TRIGGER_EVENT,
    OTYP_Void,
    0 | FOPTI_Fn,
    COptThunkMgr::ThunkOptBasicFIRE_TRIGGER_EVENT,
    false,
    NULL,
    NULL,
    NULL,
    CID_Basic,
    "FIRE_TRIGGER_EVENT",
    OID_Nil,
    0, …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 build-time

10
推荐指数
2
解决办法
2057
查看次数

您可以将现有的 git 存储库转换为“blobless”存储库吗?

如今,git 提供了“部分克隆”选项,可以下载存储库的提交和树,同时允许按需下载 blob,从而节省网络带宽和磁盘空间。

git clone这可以在初始阶段通过传递 来启用--filter=blob:none。但是,有没有办法将现有的本地存储库转换为“blobless”格式?这应该通过删除已知可从“promisor”远程获取的任何本地 blob 来节省一些磁盘空间。

git git-clone

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

为什么不接受使用概念的此类专业化?

以下代码尝试使用概念对类进行部分特化,并向特化添加方法,但被 clang 11.0.0 拒绝:

#include <concepts>

template <typename T> // note: previous template declaration is here
struct S {};

template <std::integral T>
struct S<T>
{
    void f();
};

template <std::integral T> // error: type constraint differs in template redeclaration
void S<T>::f()
{
}
Run Code Online (Sandbox Code Playgroud)

clang 给出了错误信息:

<source>:14:16: error: type constraint differs in template redeclaration
template <std::integral T>
               ^
<source>:3:11: note: previous template declaration is here
template <typename T>
Run Code Online (Sandbox Code Playgroud)

(参见https://godbolt.org/z/Wv1ojK)。为什么这段代码是错误的?或者这是clang中的一个错误?(FWIW,此代码被 gcc trunk 和 MSVC 19.28 接受,尽管这不能保证正确性。)

c++ templates template-meta-programming c++-concepts c++20

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

支持SRGB的图像在Pillow中调整大小

Pillow的基本Image.resize功能似乎没有任何SRGB感知过滤选项.有没有办法在Pillow中进行SRGB感知调整大小?

我可以通过将图像转换为浮动来手动完成并应用SRGB转换自己...但我希望有一种内置的方式.

python srgb pillow

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

如何在 C++20“requires”表达式中使用未指定的类型?

我正在尝试编写一个 C++20 概念来表达类型具有某种方法(该方法接受参数)的要求,但出于此概念的目的,我不关心参数类型是什么。

我试着写一些类似的东西:

template <typename T>
concept HasFooMethod = requires(T t, auto x)
{
    { t.Foo(x) } -> std::same_as<void>;
};
Run Code Online (Sandbox Code Playgroud)

然而,gcc 和 clang 都拒绝这一点,并给出一个错误,即“auto”不能以这种方式在 require 表达式的参数列表中使用。

另一种方法是将“x”的类型作为第二个模板参数:

template <typename T, typename TX>
concept HasFooMethod = requires(T t, TX x)
{
    { t.Foo(x) } -> std::same_as<void>;
};
Run Code Online (Sandbox Code Playgroud)

但这需要在使用该概念时明确指定 TX,因此无法推断:

struct S { void Foo(int); };
static_assert(HasFooMethod<S>);         // doesn't compile
static_assert(HasFooMethod<S, int>);    // the 'int' must be specified
Run Code Online (Sandbox Code Playgroud)

有没有办法编写一个允许 Foo 接受未指定类型的参数的概念?

需要约束模板成员函数的概念定义问题非常相似,但不相同:该问题询问如何要求(模板化)方法可以采用满足给定概念的任何类型,而这个问题是关于要求方法采用某种特定类型,尽管该类型未指定。就量词而言,另一个问题是关于(有界)普遍量化,而这个问题是关于存在量化。另一个问题的答案也不适用于我的情况。

c++ c++-concepts c++20

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