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?.