我正在制作一个C ++库,该库在很大程度上依赖于RTTI(到另一种语言的可自定义桥接),并且对字符串文字类型非常困惑。
这是我做的一个简单测试,用于显示问题:
std::cout << typeid(const char*).name() << std::endl; // PKc
std::cout << std::any("").type().name() << std::endl; // PKc
std::cout << typeid("").name() << std::endl; // A1_c
Run Code Online (Sandbox Code Playgroud)
对我来说,它看起来像前两个打印出的类型const char*
,但最后一个是数组。
为什么对结果std::any("").type()
和typeid("")
不同?有没有办法获得第一个行为,即使字符串文字的结果一致(我使用类型标识来调用不同的类型处理程序)?
PS:在Ubuntu 19.04上使用Clang版本8.0.0-3(标签/ RELEASE_800 / final)进行测试。
我在游戏中使用 SDL2。我一直在使用自定义 FindSDL2.cmake,因为标准 CMake 集中没有。但是,前段时间确实出现了有关 FindSDL2 的帖子。示例:Reddit 帖子。
如果你的 cmake 足够新并且它有 FindSDL2.cmake 文件,你可以这样做:
find_package(SDL2 REQUIRED)
Run Code Online (Sandbox Code Playgroud)
但是当我下载最新的 CMake (3.13.2) 时,它不包含FindSDL2.cmake
.
这是怎么回事?
我找不到信息,如何使用uinput
/ 创建带有几个按钮的操纵杆suinput
.python
使用示例python-uinput
:
import uinput
def main():
events = (
uinput.BTN_JOYSTICK,
uinput.ABS_X + (0, 255, 0, 0),
uinput.ABS_Y + (0, 255, 0, 0),
)
with uinput.Device(events) as device:
for i in range(20):
# syn=False to emit an "atomic" (5, 5) event.
device.emit(uinput.ABS_X, 5, syn=False)
device.emit(uinput.ABS_Y, 5)
device.emit_click(uinput.BTN_JOYSTICK)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
如您所见,在此示例中使用BTN_JOYSTICK
as按钮.如何创建第二个按钮/上瘾两个ABS_X
/ ABS_Y
?
注:我使用python
为例,应用语言是C
有libsuinput
.
Gcc并printf
说这timer_t
是指针(在我身上linux
).但是这个指针放置了什么,并且是NULL
一个有效的计时器ID?
此外,它是特定于平台的东西,例如它是指针on linux
,int on macOs
,sth.别的BSD
.
我使用std::regex
从字符串文字创建的内容,如下所示:
std::regex vowel_re("a|e|i|o|u");
Run Code Online (Sandbox Code Playgroud)
static
为了节省施工时间甚至是这样做是个好主意吗static const
?这个正则表达式很可能会被重用。
我正在创建cocos2d-x游戏并包含上游cocos fom git(它包括一些关键的修复和功能).但是,使用SDKBOX需要修补一些cocos文件(在子模块中).
是否可以将这些文件(甚至更好的补丁)包含到主存储库中?当然,可以分叉cocos2d-x存储库并在那里修补它们,但它使更新更加复杂(创建拉取请求并首先合并它).
我使用 ESP-32 并且需要std::shared_ptr
使用 FreeRTOS 队列通过。然而,它失去了一个链接。我认为这是问题的根源:
#include <iostream>
#include <memory>
#define PRINT_USE_COUNT(p) std::cout << "Use count: " << p.use_count() << std::endl;
extern "C" {
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/queue.h>
}
class testClass {
public:
testClass() {
std::cout << "Class is constructed" << std::endl;
};
virtual ~testClass() {
std::cout << "Class is destructed" << std::endl;
};
};
struct container {
std::shared_ptr<testClass> field;
};
extern "C" void app_main(void) {
auto queue = xQueueCreate(1, sizeof(container));
auto p = std::make_shared<testClass>();
PRINT_USE_COUNT(p); // …
Run Code Online (Sandbox Code Playgroud) 我正在C ++ 17项目中,其中有以下定义(当然是在我的名称空间中):
using CppFunction = std::function<int(StatePtr&)>;
template<typename T>
using CppMethod = std::function<int(T*, StatePtr&)>;
Run Code Online (Sandbox Code Playgroud)
现在,我声明一些功能:
template<typename... Targs, typename F>
constexpr CppFunction CppFunctionNative(F func);
template<typename... Targs, typename F, typename T = (deducing class from F here) >
constexpr CppMethod<T> CppMethodNative(F func);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,第一个声明会导致编译器错误Constexpr function's return type is not a literal type
,但是第二个效果很好。
为什么会这样?它与第二个函数的返回类型是template的事实有关吗?
UPD:简化的独立示例:
#include <functional>
using CppFunction = std::function<int(int&)>;
template<typename T>
using CppMethod = std::function<int(T*, int&)>;
// Clang will complain
template<typename F>
constexpr CppFunction CppFunctionNative(F func) {};
// Clang will …
Run Code Online (Sandbox Code Playgroud)