如何将C++ varadic模板(参数包)匹配到枚举类

3htmauhk  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(163)

我希望replace some template parameters是一个复杂的类型(SYCL访问器),但是有些模板参数是枚举类,有些是普通的类/结构类型。
下面的例子说明了基本思想。除非我显式写出所有枚举类,否则它不会编译。如果用参数包来掩盖这些就好了,但是“template”似乎与“enum class”不匹配。

  1. enum class Animal {
  2. Fox, Gox
  3. };
  4. enum class Food {
  5. Gruel
  6. };
  7. template <typename T, int D, Animal A, Food F>
  8. struct Blah {
  9. };
  10. template<typename, typename>
  11. struct apply_accessor {};
  12. /* Does not work, "class" doesn't match "enum class X". */
  13. template<template<typename,int,class...> typename Acc,
  14. typename T1, typename T, int D,
  15. class ... Ts>
  16. struct apply_accessor<Acc<T1, D, Ts...>, T> {
  17. using type = Acc<T, D, Ts...>;
  18. };
  19. /* Could work, but only matches animal sequences. */
  20. template<template<typename,int,Animal...> typename Acc,
  21. typename T1, typename T, int D, Animal... A>
  22. struct apply_accessor<Acc<T1, D, A...>, T> {
  23. using type = Acc<T, D, A...>;
  24. };
  25. /* Works, but really?
  26. template<template<typename,int,Animal,Food> typename Acc,
  27. typename T1, typename T, int D, Animal A, Food F>
  28. struct apply_accessor<Acc<T1, D, A, F>, T> {
  29. using type = Acc<T, D, A, F>;
  30. };*/
  31. int main() {
  32. Blah<int,1,Animal::Fox,Food::Gruel> x;
  33. Blah<int,1,Animal::Gox,Food::Gruel> y;
  34. typename apply_accessor<decltype(x), float>::type z;
  35. }

注意:似乎对于非参数包,相反的问题has also appeared。注意:解决方案可能是C++17<auto...>--Infer enum class type from enum class value template parameter?

oymdgrw7

oymdgrw71#

这个咒语成功了,但需要C++17编译器魔法,这可能会对用户造成危险。

  1. template<template<typename,int,auto...> typename Acc,
  2. typename T1, typename T, int D,
  3. auto ... Ts>
  4. struct apply_accessor<Acc<T1, D, Ts...>, T> {
  5. using type = Acc<T, D, Ts...>;
  6. };

相关问题