1

I'd like to replace some template parameters in a complicated type (a SYCL accessor), but some of the template parameters are enum classes, and some are plain class/struct types.

The following example illustrates the basic idea. It will not compile unless I explicitly write out all the enum classes. It would be nice to gloss over those with a parameter pack, but "template" doesn't seem to match "enum class".

enum class Animal {
    Fox, Gox
};
enum class Food {
    Gruel
};

template <typename T, int D, Animal A, Food F>
struct Blah {
};

template<typename, typename>
struct apply_accessor {};
/* Does not work, "class" doesn't match "enum class X". */
template<template<typename,int,class...> typename Acc, 
         typename T1, typename T, int D,
         class ... Ts>
struct apply_accessor<Acc<T1, D, Ts...>, T> {
    using type = Acc<T, D, Ts...>;
};
/* Could work, but only matches animal sequences. */
template<template<typename,int,Animal...> typename Acc, 
         typename T1, typename T, int D, Animal... A>
struct apply_accessor<Acc<T1, D, A...>, T> {
    using type = Acc<T, D, A...>;
};
/* Works, but really?
template<template<typename,int,Animal,Food> typename Acc, 
         typename T1, typename T, int D, Animal A, Food F>
struct apply_accessor<Acc<T1, D, A, F>, T> {
    using type = Acc<T, D, A, F>;
};*/

int main() {
    Blah<int,1,Animal::Fox,Food::Gruel> x;
    Blah<int,1,Animal::Gox,Food::Gruel> y;

    typename apply_accessor<decltype(x), float>::type z;
}

Note: it seems that for non-parameter packs, the opposite question has also appeared. Note: probably the solution is C++17 <auto...> -- Infer enum class type from enum class value template parameter?.

David M. Rogers
  • 383
  • 3
  • 11

1 Answers1

0

This incantation succeeds, but requires C++17 compiler magic, which may prove dangerous to users.

template<template<typename,int,auto...> typename Acc,
         typename T1, typename T, int D,
         auto ... Ts>
struct apply_accessor<Acc<T1, D, Ts...>, T> {
    using type = Acc<T, D, Ts...>;
};
David M. Rogers
  • 383
  • 3
  • 11