Skip to content

Commit

Permalink
完全放弃使用模板偏特化。
Browse files Browse the repository at this point in the history
  • Loading branch information
microcai committed Oct 20, 2024
1 parent 1e36f69 commit ea6888e
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 35 deletions.
39 changes: 5 additions & 34 deletions include/ucoro/awaitable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,39 +134,10 @@ namespace ucoro

namespace traits
{
//////////////////////////////////////////////////////////////////////////
// 用于从 A = U<T> 类型里提取 T 参数
// 比如
// template_parameter_of<local_storage_t<int>, local_storage_t>; // int
// template_parameter_of<decltype(local_storage), local_storage_t>; // void
//
// 首先定义一个接受 template_parameter_of<Testee, FromTemplate> 这样的一个默认模板萃取
template<typename Testee, template<typename> typename FromTemplate>
struct template_parameter_traits;

// 接着定义一个偏特化,匹配 template_parameter_traits<模板名<参数>, 模板名>
// 这样,这个偏特化的 template_parameter_traits 就有了一个
// 名为 template_parameter 的成员类型,其定义的类型就是 _template_parameter
// 于是就把 TemplateParameter 这个类型给萃取出来了
template<template<typename> typename ClassTemplate, typename TemplateParameter>
struct template_parameter_traits<ClassTemplate<TemplateParameter>, ClassTemplate>
{
using template_parameter = TemplateParameter ;
};

// 最后,定义一个简化用法的 using 让用户的地方代码变短点
template<typename TesteeType, template<typename> typename FromTemplate>
using template_parameter_of = typename template_parameter_traits<
std::decay_t<TesteeType>, FromTemplate>::template_parameter;

// 利用 通用工具 template_parameter_of 萃取 local_storage_t<T> 里的 T
template<concepts::local_storage_type LocalStorage>
using local_storage_value_type = template_parameter_of<LocalStorage, local_storage_t>;


// 利用 通用工具 template_parameter_of 萃取 awaitable<T> 里的 T
template<concepts::awaitable_type AwaitableType>
using awaitable_return_type = template_parameter_of<AwaitableType, awaitable>;
// 直接获得 local_storage_t<T> 里面的 T 的类型。
// 使用 decltype(local_storage_value_type(local_storage)) 获得
template<typename T>
constexpr T local_storage_value_type(local_storage_t<T>);

} // namespace traits

Expand Down Expand Up @@ -326,7 +297,7 @@ namespace ucoro
if constexpr (concepts::local_storage_type<std::decay_t<A>>)
{
// 调用 co_await local_storage_t<T>
return local_storage_awaiter<traits::local_storage_value_type<std::decay_t<A>>>{this};
return local_storage_awaiter<decltype(traits::local_storage_value_type(awaiter))>{this};
}
else if constexpr (concepts::is_awaitable_v<A>)
{
Expand Down
2 changes: 1 addition & 1 deletion tests/test3/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ int main(int argc, char **argv)

static_assert(ucoro::concepts::local_storage_type<ucoro::local_storage_t<void>>, "not a local_storage_t");

using local_storage_template_parameter = ucoro::traits::template_parameter_of<decltype(ucoro::local_storage), ucoro::local_storage_t>;
using local_storage_template_parameter = decltype(ucoro::traits::local_storage_value_type(ucoro::local_storage));

static_assert(std::is_void_v<local_storage_template_parameter>, "local_storage is not local_storage_t<void>");

Expand Down

0 comments on commit ea6888e

Please sign in to comment.