gpt4 book ai didi

c++ - 使用带有 static_assert 的类型别名缩小模板中允许的类型

转载 作者:行者123 更新时间:2023-11-30 05:33:32 25 4
gpt4 key购买 nike

在学习基于模板的元编程时,我遇到了以下问题:我有一个使用类型别名的模板,我想使用 static_assert 缩小允许的类型,但我不确定如何编写它:

using service_func_plain_loop_t = std::function<void(void)>;
using service_func_with_arg_loop_t = std::function<void(std::string)>;
using service_callbacks_t = std::map<event, std::function<bool(void) >>;

template<typename service_loop> using service_functionality_t =
std::pair<service_loop, service_callbacks_t>;
static_assert(
std::is_convertible<service_loop,service_func_plain_loop_t>.value ||
std::is_convertible<service_loop,service_func_with_arg_loop_t>.value,
"service_loop has to be either service_func_plain_loop_t or "
"service_func_with_arg_loop_t");

此方法失败,因为 service_loop 未在 static_assert 范围内声明。检查类时,我可以将断言移到类范围内,但这里的语法是什么?

最佳答案

您可以编写一个辅助类来执行 static_assert :

template <typename service_loop>
struct service_functionality {
static_assert(
std::is_convertible<service_loop,service_func_plain_loop_t>::value ||
std::is_convertible<service_loop,service_func_with_arg_loop_t>::value,
"service_loop has to be either service_func_plain_loop_t or "
"service_func_with_arg_loop_t");

using type = std::pair<service_loop, service_callbacks_t>;
};

template<typename service_loop> using service_functionality_t =
typename service_functionality<service_loop>::type;

还要注意它应该是std::is_convertible<T,U>::valuestd::is_convertible<T,U>{}而不是 std::is_convertible<T,U>.value .虽然我们可能会得到 std::is_convertible_v<T,U> C++17 中的辅助变量模板。

Live Demo

关于c++ - 使用带有 static_assert 的类型别名缩小模板中允许的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34740824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com