cyanray / mirai-cpp

本项目为 mirai-api-http 的 C++ 封装,方便使用 C++ 开发基于 mirai-api-http 插件。
GNU Affero General Public License v3.0
148 stars 38 forks source link

支持C++20 #66

Closed cyanray closed 3 years ago

cyanray commented 3 years ago

mirai-cpp在c++20下编译会报找不到 std::result_of 的错误。(来自于第三方库 ThreadPool) 根据cppreferencestd::result_of在C++17被标记为deprecated,C++20中被移除。

如果是C++20环境,把 std::result_of 修改成 std::invoke_result 就可以了。

Chlorie commented 3 years ago

可以在 include 对应的头文件之前

#define _HAS_FEATURES_REMOVED_IN_CXX20 // 或者 _HAS_DEPRECATED_RESULT_OF 如果不想把别的 C++20 删除的东西也还原
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS

或者自己造个线程池轮子(((

cyanray commented 3 years ago

可以在 include 对应的头文件之前

#define _HAS_FEATURES_REMOVED_IN_CXX20 // 或者 _HAS_DEPRECATED_RESULT_OF 如果不想把别的 C++20 删除的东西也还原
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS

或者自己造个线程池轮子(((

原来还有这种黑科技……

好像也可以直接用

decltype(f(args...))

来代替

typename std::result_of<F(Args...)>::type
Chlorie commented 3 years ago

可以在 include 对应的头文件之前

#define _HAS_FEATURES_REMOVED_IN_CXX20 // 或者 _HAS_DEPRECATED_RESULT_OF 如果不想把别的 C++20 删除的东西也还原
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS

或者自己造个线程池轮子(((

原来还有这种黑科技……

好像也可以直接用

decltype(f(args...))

来代替

typename std::result_of<F(Args...)>::type

MSVC 在删除旧功能上很积极,gcc 和 clang 倒是更看重后向兼容而不是符合标准……

如果是自己的代码肯定会改成新的,但是问题来自第三方库的话还是尽量不要动不属于自己的代码吧,用比如上面那种方法绕过去我觉得比较 OK(

cyanray commented 3 years ago

可以在 include 对应的头文件之前

#define _HAS_FEATURES_REMOVED_IN_CXX20 // 或者 _HAS_DEPRECATED_RESULT_OF 如果不想把别的 C++20 删除的东西也还原
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS

或者自己造个线程池轮子(((

原来还有这种黑科技…… 好像也可以直接用

decltype(f(args...))

来代替

typename std::result_of<F(Args...)>::type

MSVC 在删除旧功能上很积极,gcc 和 clang 倒是更看重后向兼容而不是符合标准……

如果是自己的代码肯定会改成新的,但是问题来自第三方库的话还是尽量不要动不属于自己的代码吧,用比如上面那种方法绕过去我觉得比较 OK(

那个库没人维护了,所以我fork一份自己维护,这样就可以修改了 hhhhh