在OpenCV中,cv::FeatureDetector通过提供功能的名称来创建a是很常见的:
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SURF");
Run Code Online (Sandbox Code Playgroud)
这是一个工厂模式,是cv::FeatureDetector一个抽象类.
然后,给定一个类型的变量cv::Ptr<cv::FeatureDetector>,是否可以检索该功能的名称?这是"SURF"我的例子.
在我之前提出的与按位操作有关的问题中,我被告知,如果数组没有与地址对齐,那么访问char带有int指针的数组的代码(一次操作更大的字节块)可能会有问题.charint
然后,在C中思考,我想知道malloc为未知类型分配内存时会发生什么.例如,如果我这样做void *p = malloc(sizeof(int));,我是否获得有效的char/int/long-aligned内存地址?
根据SO中引用标准的一些答案,"返回的指针应适当对齐,以便可以将其转换为任何完整对象类型的指针".
因此,我明白,我可以去char*到int*,在这种情况下没有问题:
char *p = malloc(16);
int *n = (int*)p; // use n a base of an array of 16 / sizeof(int) ints
Run Code Online (Sandbox Code Playgroud)
这是对的吗?
转向C++,似乎标准中出现了相同的规则.那么,如果我这样做,我可以假设没有对齐风险吗?
char *p = new char[16];
int *n = reinterpret_cast<int*>(p);
Run Code Online (Sandbox Code Playgroud) 我有一个使用第三方库(我们称之为somelib)的项目,我为其编写了一个 cmake 文件来搜索它。
这是somelibConfig.cmake我编写并放入的文件/usr/local/lib/cmake/somelib/:
FIND_LIBRARY(somelib_LIBRARY somelib
PATHS /usr/local/lib
NO_DEFAULT_PATH
)
SET(somelib_LIBRARIES ${somelib_LIBRARY})
FIND_PATH(somelib_INCLUDE_DIR somelib.hpp
PATHS /usr/local/include/somelib
NO_DEFAULT_PATH
)
SET(somelib_INCLUDE_DIRS ${somelib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)
然后,如果我find_package(somelib REQUIRED)这样做,效果就很好。
但是,如果我移动并重命名somelibConfig.cmake为myproject/CMakeModules/Findsomelib.cmake(此目录被添加到CMAKE_MODULE_PATH),在find_package我看到变量somelib_INCLUDE_DIRS和somelib_LIBRARY已正确填充后,但未somelib_FOUND设置(即使如此,find_package也不会中止编译)。
这*Config.cmake对于 a 有效吗Find*.cmake?
怎么可能除了这个变量之外的所有变量都*_FOUND被设置了呢?
如果未设置,为什么不find_package中止REQUIRED编译?*_FOUND
我想写一个看起来像这样的函数:
template<class T>
void Foo(const std::shared_ptr<const T>& ptr);
Run Code Online (Sandbox Code Playgroud)
所以我可以这样称呼它:
std::shared_ptr<int> ptr;
Foo(ptr);
Run Code Online (Sandbox Code Playgroud)
但是,编译器无法推断T,我必须明确它:
Foo<int>(ptr);
Run Code Online (Sandbox Code Playgroud)
或者用它重载void Foo(const std::shared_ptr<T>& ptr).
我可以有一个单一的声明Foo,const T以便T可以推断出来吗?
我使用 OpenCV FileStorage 将地图存储在 yaml 文件中,如下所示:
cv::FileStorage fs("file.yaml.gz", cv::FileStorage::WRITE);
std::string somekey = ...;
double someval = ...;
fs << "mymap" << "{:" << somekey << someval << "}";
Run Code Online (Sandbox Code Playgroud)
现在,我想取回数据,但我不知道地图的键。我想代码应该是这样的:
cv::FileStorage fs("file.yaml.gz", cv::FileStorage::READ);
cv::FileNode fn = fs["mymap"];
// fn has type == cv::FileNode::MAP
// fn has size == 1 element (one pair)
// fn[0] returns also a MAP with 1 element
Run Code Online (Sandbox Code Playgroud)
是否可以在没有密钥的情况下获得该地图的所有对?我已经检查过cv::FileNodeIterator,但似乎没有解决这个问题。C 接口CvFileNode允许在提供密钥后检索值。
特定
template<class T>
struct TimeData
{
T duration;
}
Run Code Online (Sandbox Code Playgroud)
static_assert如果T是某种类型的,我如何编写一个检查编译时间std::chrono::duration?记住std::chrono::duration是一个模板类.
换句话说,我如何检查类型是否是模板类的实例化?
这就是我所拥有的:
struct Foo {
int index;
}
std::set<std::shared_ptr<Foo>> bar;
Run Code Online (Sandbox Code Playgroud)
我想bar通过它们的索引来命令元素,而不是通过std::less<std::shared_ptr<T>>与指针相关的默认函数来命令它们.
我读过我可以输入std::set<std::shared_ptr<Foo>, std::owner_less<std::shared_ptr<Foo>>> bar,但我更喜欢坚持以前的语法.
我试过定义std::less<std::shared_ptr<Foo>>,但它实际上并没有被set函数使用.有没有办法实现这个目标?
如何获取std::bind表达式的类型以将其存储在类成员中?例如,我有这个:
template<class F, class ...Args>
void foo(F&& funct, Args&&... args) {
typedef decltype(std::bind(funct, std::forward<Args>(args)...)) T;
T bar = std::bind(funct, std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
但我想将其转换为:
template<class F, class ...Args>
class Foo {
void foo(F&& funct, Args&&... args) {
bar = std::bind(funct, std::forward<Args>(args)...);
}
T bar; // what is the type of bar?
}
Run Code Online (Sandbox Code Playgroud)