我正在尝试在我的应用中加入一些与相机相关的功能.我手动打开摄像头,并获得与预览流setPreviewCallback和startPreview.我不使用曲面来显示预览,但我确实将其设置为符合Camera API文档.这是我打开相机的方式:
public Camera openCamera(int id)
{
m_openedCamera = Camera.open(id);
m_surfaceHolder = new SurfaceView(MyApplication.instance().getApplicationContext()).getHolder();
Assert.assertNotNull(m_openedCamera);
m_openedCamera.setPreviewDisplay(m_surfaceHolder);
m_openedCameraFacing = facing;
if (m_openedCamera != null)
m_openedCamera.setPreviewCallback(this);
m_openedCamera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)
这就是我发布它的方式,这里没什么好看的:
public void releaseCamera()
{
if (m_openedCamera != null)
{
m_openedCamera.stopPreview();
m_openedCamera.release();
m_openedCamera = null;
}
}
Run Code Online (Sandbox Code Playgroud)
它有点起作用,但是当我释放相机时,我得到一个异常"在释放后调用的方法()".澄清一下:相机发布后我不会调用任何相机方法.在调试器下进行双重和三重检查,我没有.我认为这里有混合的同步和异步调用会导致问题.
#include <functional>
#include <memory>
#include <iostream>
struct A
{
~A() {std::cout << "~A()" << std::endl;}
};
void test(std::shared_ptr<A> ptr)
{
std::cout << (ptr ? "not empty" : "empty") << std::endl;
}
void forwarder(std::function<void(std::shared_ptr<A>)> f, std::shared_ptr<A>&& ptr)
{
f(std::forward<std::shared_ptr<A>>(ptr));
f(std::forward<std::shared_ptr<A>>(ptr));
}
void main()
{
forwarder([](std::shared_ptr<A> ptr){ test(ptr); }, std::make_shared<A>());
}
Run Code Online (Sandbox Code Playgroud)
问题在于forwarder功能.在第一次调用后,test将shared_ptr与一起-被破坏A的对象,很明显.所以在第二次调用test指针时已经是空的.我不明白为什么会这样.std::forward实施是微不足道的.
所以,我有两个问题:
1.如何std::forward导致rvalue对象的破坏传递给它?哪一段代码呢?
2.如何解释这个C++设计决策?似乎违反直觉的,我认为ptr是不超出范围还没有,但已经死了.
我尝试连接一个QGraphicsObject子类和一个QGraphicsView子类(在QGraphicsObject构造函数中使用以下行)
connect(this, SIGNAL(paintImage(QPainter *, const QImage &)), this->scene()->views().front(), SLOT(paintImage(QPainter *, const QImage &)));
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
D:\Project\Scene\PointField.cpp:18: error : C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const: cannot convert 'QGraphicsView *' to 'const QObject *'
The point types are unrelated; conversion needs reinterpret_cast, C style cast or function style cast.
Run Code Online (Sandbox Code Playgroud)
我从QGraphicsView继承自的文档中看到QObject,并且Q_OBJECT两个子类声明中都有宏...有人有想法吗?
代码样式设置下有各种ON/OFF换行选项,但我看不到调整限制的位置.说,我想要120个字符而不是80个字符.
QListWidget::setIconSize尺寸> 200x200似乎没有任何影响.是故意还是我做错了什么?在文档中没有提到这样的上限.可能有另一个属性限制图标大小?
我正在使用Qt 5.
我需要一个POSIX或Linux API函数来获取文件路径并返回此文件的扩展名.每个平台都应该有一个,但我不能用于Linux.它叫什么?
如果我#include <immintrin.h>收到此错误:
错误:未在此范围内声明'__builtin_ia32_addpd256'
我已定义__AVX__和__FMA__宏使AVX可用,但显然这还不够.如果我使用编译器标志-mavx而不是宏,则没有错误,但该解决方案是不可接受的.那么,我还应该定义什么才能使用AVX?
我有几个全局静态对象.别介意这些是Qt类,这与此事无关.
static const QStringList JpegFileExtensions = QString::fromLatin1(jpegExtensions).split(" ");
static const QStringList TiffFileExtensions = QString::fromLatin1(tiffExtensions).split(" ");
static const QStringList RawFileExtensions = QString::fromLatin1(rawExtensions).split(" ");
static const QStringList PngFileExtensions = QString::fromLatin1(pngExtensions).split(" ");
Run Code Online (Sandbox Code Playgroud)
现在,我有另一个静态对象,它由一些函数初始化,它接受前面的对象并计算结果:
inline QString GetAllSupportedExtensions() {
QStringList extensions = QStringList() << JpegFileExtensions << TiffFileExtensions << RawFileExtensions << PngFileExtensions;
for (QString& item: extensions)
item.remove("*.");
return extensions;
}
static const QString AllSupportedExtensions = GetAllSupportedExtensions();
Run Code Online (Sandbox Code Playgroud)
但由于这个GetAllSupportedExtensions函数没有在其他地方使用,我想摆脱它,以免它混淆命名空间.当然,我想过使用lambda,它是一个匿名函数:
static const QStringList AllSupportedExtensions = []() -> QStringList {
QStringList list = QStringList() << JpegFileExtensions << TiffFileExtensions …Run Code Online (Sandbox Code Playgroud) 我需要移位字节缓冲区的内容.当然,我开始写作memcpy,但后来意识到它可能restrict有源和目标的说明符.我的实施(MSVC 2013)似乎没有它.Cppreference列出了两个memcpy版本,有和没有restrict,但我没有得到它 - 我不认为这些是重载,并且我不清楚编译器如何正确地确定选择哪一个.另一方面,该memcpy函数可以count在运行时分析地址和参数,以确定地址范围是否重叠.
那么,允许memcpy使用重叠参数调用吗?如果没有,有没有办法执行比普通更好的操作for?
我想要做的很简单:在一个可变的类模板中,我想检查类型的一些编译时条件.在这种情况下,我想知道包装中是否有某种类型.这就是C++ 17的折叠表达式可能看起来的代码,但显然这不是有效的语法.怎么实现呢?
#include <type_traits>
template <class... Types>
struct TypesPack
{
template <typename T>
static constexpr bool hasType() {
return std::is_same<T, Types>::value || ... || false;
}
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个接受复杂参数的函数.假设它可以是一个类,或者它可以是一个类模板.函数内部的代码对于所有参数都是相同的,我不需要在任何地方引用参数的类型.所以,我想写这样的东西:
auto func(auto& someComplicatedClassInstance) {
return someComplicatedClassInstance.someMemberFunc();
}
Run Code Online (Sandbox Code Playgroud)
我不能只是写,template <typename T>因为如果T本身就是模板,它就不会起作用,而且auto函数参数在C++中不是.制作funclambda是唯一的方法吗?奇怪的是,为lambda启用相同的编译器功能,但不启用普通函数.在我的具体情况下,我正在写一个重载因为operator<<我不能使它成为一个lambda.
一个简单的问题,但我无法找到答案,既不是在SO上,也不是在cppreference.com和类似网站上.
std::array按价值返回是否合法?
std::array<int, 3> f() {
return std::array<int, 3> {1, 2, 3};
}
Run Code Online (Sandbox Code Playgroud)
如果它是合法的,那么按价值将它传递给函数也是合法的,对吗?