将可变参数模板类的模板参数解包为常量和常量数组

Posted

技术标签:

【中文标题】将可变参数模板类的模板参数解包为常量和常量数组【英文标题】:Unpacking template parameters of a variadic templated class to constants and array of constants 【发布时间】:2012-08-04 00:02:45 【问题描述】:

我对 C++2011 的可变参数模板还很陌生,我想知道是否存在执行以下操作的技巧:

template<typename T, unsigned int... TDIM> class VariadicTest

    public:
        static const unsigned int order_const = sizeof...(TDIM);
        static const unsigned int size_const = // TDIM1*TDIM2*TDIM3...
        static const unsigned int dim_const[order_const] = // TDIM1, TDIM2, TDIM3... 
                                                          // if not possible : 
                                                          // dim_const[64] = TDIM1, TDIM2, TDIM3, 0, ..., 0

;

做这样的事情有什么“诀窍”吗?

非常感谢。

【问题讨论】:

size_const 应该很简单(创建一个 constexpr 可变参数模板函数,该函数返回头部乘以尾部的乘积——如果没有尾部则返回头部值)。数组初始化是棘手的部分... 实际上,问题中提出的语法是无效的,因为您不能在成员的声明中提供静态数组的值......话虽如此,问题就像如果将初始化移到定义中,则很难:) 【参考方案1】:

下面是实现其他两个功能的方法:

template<unsigned int... T> struct mul;
template<unsigned int L,unsigned int... T> struct mul<L,T...>

static const int val= L*mul<T...>::val;
;
template<unsigned int L> struct mul<L>

static const int val= L;
;

template<typename T, unsigned int... TDIM> class VariadicTest

    public:
        static const unsigned int order_const = sizeof...(TDIM);
        static const unsigned int size_const = mul<TDIM...>::val;
        static const unsigned int dim_const[order_const];
;
template<typename T, unsigned int... TDIM> 
const unsigned int VariadicTest<T,TDIM...>::dim_const[order_const] = TDIM...;

测试:http://liveworkspace.org/code/cfb0ec09a05931cfcc00edf29866e716

【讨论】:

【参考方案2】:

这是一个部分答案,它是 order_constsize_const。但是我还看不到dim_const 怎么办。

#include<iostream>
using namespace std;

template<typename T, unsigned int... TDIM>
class VariadicTest;

template<typename T>
class VariadicTest<T>

    public:
        static const unsigned int order_const = sizeof...(TDIM);

        static const unsigned int size_const = 1;
;
template<typename T, unsigned int baseTDIM, unsigned int... others>
class VariadicTest<T, baseTDIM, others...>

    public:
        static const unsigned int order_const  = sizeof...(TDIM);
        static const unsigned int size_const = baseTDIM * VariadicTest<T,others...> :: size_const;    
;

int main() 
        VariadicTest<double, 9, 4, 5> x;
        cout << x.order_const << endl;
        cout << x.size_const << endl;

【讨论】:

嗯...order_const 不是已经在问题中解决了吗? (即sizeof...(TDIM) 应转换为模板可变参数部分的元素数。 其实order_const不是问题。问题在于 size_const 和 dim_const... @DavidRodríguez-dribeas,你是对的。我想我开始这样做是为了练习这种递归。我会把sizeof... 放回去。

以上是关于将可变参数模板类的模板参数解包为常量和常量数组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

传递可变数量的实参

为每个可变参数模板参数和一个数组调用一个函数

使用可变参数模板创建静态数组

在可变参数模板类中初始化静态数组

可变参数模板到数组访问的无递归扩展