我希望replace some template parameters是一个复杂的类型(SYCL访问器),但是有些模板参数是枚举类,有些是普通的类/结构类型。
下面的例子说明了基本思想。除非我显式写出所有枚举类,否则它不会编译。如果用参数包来掩盖这些就好了,但是“template”似乎与“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;
}
注意:似乎对于非参数包,相反的问题has also appeared。注意:解决方案可能是C++17<auto...>--Infer enum class type from enum class value template parameter?。
1条答案
按热度按时间oymdgrw71#
这个咒语成功了,但需要C++17编译器魔法,这可能会对用户造成危险。