小编Sté*_*ane的帖子

如何让Windows根据文件关联打开外部文件?

使用特定于Win32的API,是否有一种简单的方法可以通过传入文件的路径/名称来启动外部应用程序来打开文件?

例如,假设我有一个名为C:\ tmp\image.jpg的文件.我可以调用一个API来告诉Windows打开与.jpg文件关联的应用程序吗?无需进行一堆注册表查找?

我以为我记得多年前这样做过,但我找不到它.

windows winapi file-association

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

使用libcurlpp时如何提取http响应?

尝试使用libcurlpp(libcurl的C++包装器)发布表单并获取响应.这一切都有效,但我不知道如何在http事务完成后以编程方式访问curlpp :: Easy对象的响应.Bascially:

#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
...
curlpp::Easy foo;
foo.setOpt( new curlpp::options::Url( "http://example.com/" ) );
foo.setOpt( new curlpp::options::Verbose( true ) );
...many other options set...
foo.perform();  // this executes the HTTP transaction
Run Code Online (Sandbox Code Playgroud)

当这段代码运行时,因为Verbose设置为trueI我可以看到响应得到输出到STDOUT.但是如何获得完整的响应而不是将其转储到STDOUT?curlpp :: Easy似乎没有任何方法可以访问响应.

谷歌有很多点击,人们问同样的问题,但没有回复.curlpp邮件列表是一个死区,curlpp网站的API部分已经被打破了一年.

libcurl curlpp

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

可以写catch()以从一种对象类型转换为另一种对象类型吗?

鉴于此代码,A第三方库中的位置,B是我写的代码:

class A {...};
class B { public: B( const A &a ); ... };

try
{
    A a(...);
    throw a;
}
catch ( const B &b )
{
    // ...do stuff with B, like log the details to a file...
}
Run Code Online (Sandbox Code Playgroud)

如果A抛出一个对象,则catch B跳过我的.我希望B有一个构造函数来获取一个A对象,这可能会起作用.

有什么我可以做的工作,或者我必须修改所有catch条款来处理捕获AB

c++ exception try-catch

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

如何交换两个 std::atomic 变量?

我有两个std::atomic变量,如下所示:

std::atomic<bool> b1;
std::atomic<bool> b2;
Run Code Online (Sandbox Code Playgroud)

在代码中的某个时刻我需要交换它们。它在创建线程之前运行,所以我知道只有主线程,没有其他人试图读/写这些变量。但:

std::swap(b1, b2);
Run Code Online (Sandbox Code Playgroud)

这导致:

[...] MSVC\14.24.28314\include\utility(61,1): error C2280: 'std::atomic<bool>::atomic(const std::atomic<bool> &)': attempting to reference a deleted function
[...] MSVC\14.24.28314\include\atomic(1480): message : see declaration of 'std::atomic<bool>::atomic'
[...] MSVC\14.24.28314\include\atomic(1480,5): message : 'std::atomic<bool>::atomic(const std::atomic<bool> &)': function was explicitly deleted
Run Code Online (Sandbox Code Playgroud)

我不确定为什么复制构造函数被删除。所以我使用的解决方案是使用带有第三个变量的旧式交换:

const bool tmp = b1;
b1 = b2.load();
b2 = tmp;
Run Code Online (Sandbox Code Playgroud)

但现在我很好奇:为什么std::atomic删除了 的复制构造函数?

(实际代码比两个单个变量更复杂std::atomic<bool>,但我尝试将其简化为这个问题的简单情况。)

c++ stdatomic

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

带有工具链文件和 cmake_policy 的 CMAKE

我遇到了先有鸡还是先有蛋的情况。我正在使用 vcpkg,这需要我从命令行设置 cmake 工具链文件。但我还有一些cmake_policy语句需要在工具链文件之前在 CMakeLists.txt 中设置。

以下是 cmake 的调用方式:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux ..
Run Code Online (Sandbox Code Playgroud)

但该项目使用了一些包,需要立即执行以下两个策略CMAKE_MINIMUM_REQUIRED

CMAKE_POLICY ( SET CMP0003 NEW ) # libs linked via full path
CMAKE_POLICY ( SET CMP0011 NEW ) # push/pop instead of no_policy_scope
Run Code Online (Sandbox Code Playgroud)

我的问题: 有没有办法从内部指定工具链CMakeLists.txt——大概是在设置两个 cmake 策略之后立即指定——而不是在命令行?

我收到的我想解决的警告是:

CMake Warning (dev) at vcpkg/scripts/buildsystems/vcpkg.cmake:221 (_add_executable):
  Policy CMP0003 should be set before this line.  Add code such as
    if(COMMAND cmake_policy)
      cmake_policy(SET CMP0003 NEW)
    endif(COMMAND cmake_policy)
Run Code Online (Sandbox Code Playgroud)

cmake vcpkg

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

从std :: multimap <>删除项目后,是否可以继续使用迭代器?

即使在调用multimap :: erase()之后,我还能继续使用多重映射迭代器吗?例如:

Blah::iterator iter;
for ( iter = mm.begin();
      iter != mm.end();
      iter ++ )
{
    if ( iter->second == something )
    {
        mm.erase( iter );
    }
}
Run Code Online (Sandbox Code Playgroud)

是否应该正确运行,或者在调用擦除后迭代器是否无效?像http://www.cplusplus.com/reference/stl/multimap/erase.html这样的参考站点在迭代器的生命周期主题或者建设性/破坏性方法对迭代器的影响方面都非常安静.

c++ stl multimap

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

如何让一个进程在linux中重新加载?

我有一个服务,比如f​​oo,用C++编写,以root身份运行.有通常的脚,/ etc/init.d/foo start | stop | restart.

在某些时候,foo需要重新加载自己.通常在升级完成后.但做的事情如下:

system("/etc/init.d/foo restart")
Run Code Online (Sandbox Code Playgroud)

因为一旦重新启动杀死foo,系统()调用显然也会被杀死,并且重启脚本永远不会执行完成.

是否有另一个我可以使用的调用而不是system()作为调用进程的兄弟,而不是创建一个同步子进程异步运行?

谢谢!

c++ linux restart process reload

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

Gtk + g_signal_connect()和C ++ lambda导致“无效的转换”错误

我想g_signal_connect()在Gtk +中使用lambda 。传统上,像这样工作来设置回调函数:

#include <gtk/gtk.h>
#include <iostream>

void my_callback(GtkApplication *app, gpointer user_data)
{
    std::cout << "test1" << std::endl;
}

void test1()
{
    GtkApplication *app = gtk_application_new(nullptr, G_APPLICATION_NON_UNIQUE);
    void * data = nullptr; // simple example
    g_signal_connect(app, "activate", G_CALLBACK(my_callback), data);
}
Run Code Online (Sandbox Code Playgroud)

编译上面的测试g++ $(pkg-config --cflags --libs gtk+-3.0) test.cpp以获取必要的GTK + -3.0定义。

在尝试转换my_callback1()为lambda时,我尝试了以下方法:

void test2()
{
    GtkApplication *app = gtk_application_new(nullptr, G_APPLICATION_NON_UNIQUE);
    void * data = nullptr; // simple example

    // use lambda instead of call to explicit function …
Run Code Online (Sandbox Code Playgroud)

c++ gtk lambda callback

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

如何将 lambda 与模板化 std::unique_ptr 一起使用?

诸如nvinfer1::IRuntime和 的NVIDIA TensorRT 对象nvinfer1::ICudaEngine不能直接存储在std::unique_ptr<>. 相反,他们有一个destroy()必须被调用的方法。

因此,要完成这项工作,您必须使用这样的删除器:

#include <NvInfer.h>
#include <cuda.h>

template<typename T>
struct NVIDIADestroyer
{
    void operator()(T * t)
    {
        t->destroy();
    }
};

template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, NVIDIADestroyer<T>>;
Run Code Online (Sandbox Code Playgroud)

而不是std::unique_ptr<T>,然后使用NVIDIAUniquePtr<T>.

到目前为止,这工作正常。然后我在清理代码时尝试做的是用 lambda 替换删除器,这样我就可以跳过定义NVIDIADestroyer结构。但我无法弄清楚如何做到这一点。我的想法是这样的:

template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
{
    t->destroy();
}>;
Run Code Online (Sandbox Code Playgroud)

但这会导致以下错误消息:

TRT.hpp:52:45: error: lambda-expression in template-argument
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
                                             ^
TRT.hpp:55:2: error: template argument 2 is …
Run Code Online (Sandbox Code Playgroud)

c++ lambda unique-ptr c++17 tensorrt

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

C++模板引用计数本机类型

我需要int在C++中引用count (文件描述符).我正在查看新的C++ 11和C++ 14文档,看看是否有用于引用计数的模板.它是否真的不存在于过去几年中添加到C++中的新东西的一部分,还是我在文档中错过了它?

注意我不是在寻找人们提供自己的解决方案作为StackOverflow问题的一部分!我只想知道我应该使用的是"官方"解决方案.

c++ reference-counting c++11 c++14

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