可变参数模板类型特征分辨率

Variadic templates type traits resolution

本文关键字:类型 特征 分辨率 变参 参数      更新时间:2023-10-16

>假设我有一个枚举,我希望每个枚举值都与某种类型相关联。假设标准类型是双精度类型,如果我希望它是其他类型,我需要明确指定它。

Q1:这是实现此类内容的首选方法吗?

enum A {
    v1,
    v2,
    v3
};
// for every value of A, the standard type is double
template<A a>
struct A_info {
    typedef double type;
};
// other types for certain values can be specified using specialization
template<>
struct A_info<v2> {
    typedef size_t type;
};

然后,假设我有一些函数模板,我想根据与枚举值关联的类型调用该函数:

template<typename T>
void foo() { /* do something */ }
template<A a>
void bar() { 
    foo< typename A_info<a>::type >(); 
}

这工作正常。现在假设,我有另一个依赖于可变参数模板列表的功能,我想做一些类似于上面的事情......

template<typename ... T>
void foo_multiple() { /* stuff */ }
template<A ... a>
void bar_multiple() {  
    foo_multiple< /* ??? */ > ();
}

Q2:如何实现?这到底可能吗?

只需使用所需的模式扩展可变参数包:

template<A ... a>
void bar_multiple() {  
    foo_multiple<typename A_info<a>::type...> ();
}