使用特定于Win32的API,是否有一种简单的方法可以通过传入文件的路径/名称来启动外部应用程序来打开文件?
例如,假设我有一个名为C:\ tmp\image.jpg的文件.我可以调用一个API来告诉Windows打开与.jpg文件关联的应用程序吗?无需进行一堆注册表查找?
我以为我记得多年前这样做过,但我找不到它.
尝试使用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部分已经被打破了一年.
鉴于此代码,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条款来处理捕获A和B?
我有两个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>,但我尝试将其简化为这个问题的简单情况。)
我遇到了先有鸡还是先有蛋的情况。我正在使用 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) 即使在调用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这样的参考站点在迭代器的生命周期主题或者建设性/破坏性方法对迭代器的影响方面都非常安静.
我有一个服务,比如foo,用C++编写,以root身份运行.有通常的脚,/ etc/init.d/foo start | stop | restart.
在某些时候,foo需要重新加载自己.通常在升级完成后.但做的事情如下:
system("/etc/init.d/foo restart")
Run Code Online (Sandbox Code Playgroud)
因为一旦重新启动杀死foo,系统()调用显然也会被杀死,并且重启脚本永远不会执行完成.
是否有另一个我可以使用的调用而不是system()作为调用进程的兄弟,而不是创建一个同步子进程异步运行?
谢谢!
我想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) 诸如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) 我需要int在C++中引用count (文件描述符).我正在查看新的C++ 11和C++ 14文档,看看是否有用于引用计数的模板.它是否真的不存在于过去几年中添加到C++中的新东西的一部分,还是我在文档中错过了它?
注意我不是在寻找人们提供自己的解决方案作为StackOverflow问题的一部分!我只想知道我应该使用的是"官方"解决方案.