【SDU Chart Team - Core】SVG属性类设计之枚举

SVG属性类设计 (3)

需求

SVG属性类设计(1)中,定义了基本SVG属性类,提供了泛型的实现方式。接下来我们需要让SVG属性能进一步适配枚举型属性,例如"a|b"的类型要求。(具体的例子:rect元素中的cx,其合法属性为"<number>|<length>")。由于其性质和元组一致,称之为属性元组。

属性枚举的特点是包含多个不同的类型,且选取第一个非空合法类型值作为最终类型。

设计

属性枚举既有容器的性质又是属性,因此要包含泛型组件中的所有操作。

  • 底层容器

    仍然使用泛型容器std::tuple

  • 构造

    构造时遍历内部维护的_tuple,依次设置getter和setter为。

  • 提交与取值

    属性枚举虽然是容器,但其中的所有属性类型不能独立存在。提交时并不需要将各属性依次提交,只需获取缓冲区。

    遍历所有内部属性的提交区,最终的取值是第一个获取的非空值。

  • 赋值、绑定

    对所有内部属性分别操作即可。

细节

对于模板、参数展开等问题均在上一篇中说明,此处不再赘述。

  1. 函数静态类型转换

    绑定函数时发现存在静态转换问题,即:

    std::function<T()>
    

    (T*)()
    

    以及

    [](){ return T(); }
    

    在泛型下无法进行直接推导。

    最终考虑分开处理,对函数指针独立写一个新的泛型成员函数。但是lambda函数并没有好的解决方法。

  2. Lambda函数的静态类型转换

    1. 尝试一:static_cast

      手动进行静态类型转换,但是没法推导Lamdba函数的类型。了解到Lambda函数类型是编译器推导的一个函数对象(Functor),并不能直接获取

    2. 尝试二:decltype

      尝试用在static_cast基础上使用decltype对Lambda函数类型进行推导。随后发现C++11中不支持,高版本能支持。

    3. 最终解决方法:完全泛型+显式转换

      考虑重载一个泛型成员函数接受所有类型,然后尝试对该类型进行显式转换为std::function。

      具体的显式转换如下:

      namespace detail {
          template <typename F>
          struct function_traits : public function_traits<decltype(&F::operator())> {};
      
          template <typename R, typename C, typename... Args>
          struct function_traits<R (C::*)(Args...) const>
          {
              using function_type = std::function<R (Args...)>;
          };
      }
      
      namespace Lewzen {
          template <typename F>
          using function_type_t = typename detail::function_traits<F>::function_type;
      
          template <typename F>
          function_type_t<F> lambda_to_function(F & lambda) {
              return static_cast<function_type_t<F>>(lambda);
          }
      }
      

      先通过模板元编程,结合Lambda函数作为Functor的特性,利用其括号运算符重载,获取返回类型R、参数列表Args…,Lambda的原始类型C,进而协助进行静态类型转换为std::function。

  3. 返回只读类型的std::function作为参数的泛型函数重载问题

    测试中发现Lambda函数的返回类型并非只读,因此无法有限匹配到返回值只读作为参数的重载,造成递归无限循环。但理论上是能直接静态类型转换的。

    解决方法:另外创建一个函数,与返回值只读作为参数的重载参数列表相同,名称不同。强制Lambda对应的重载调用该函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在电子设计大赛中,信号源是指用于产生特定信号的电路或设备。信号源设计在电子设计竞赛中非常重要,因为它们可以用于测试和验证其他电路的性能。信号源的功能包括产生不同频率、幅度和波形的信号,以及提供稳定的电压或电流源。在信号处理电路中,信号源可以用于信号放大、信号滤波、阻抗匹配、电平变换、非线性补偿、电流/电压转换、电压/频率转换等功能。\[1\]在全国大学生电子设计竞赛中,信号源设计是一个重要的竞赛项目之一。参赛选手需要设计和实现能够产生特定信号的电路或设备,并通过实验验证其性能和稳定性。这个竞赛项目旨在培养学生的电子设计能力和创新思维,同时推动高等学校的电子学科课程改革和实验室建设工作。\[2\]\[3\] #### 引用[.reference_title] - *1* [电子设计大赛-信号处理电路](https://blog.csdn.net/m0_51061483/article/details/108967349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [全国大学生电子设计竞赛参赛分享](https://blog.csdn.net/u013253075/article/details/126310798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值