【问题标题】: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 可变参数模板函数,该函数返回头部乘以尾部的乘积——如果没有尾部则返回头部值)。数组初始化是棘手的部分...
  • 实际上,问题中提出的语法是无效的,因为您不能在成员的声明中提供静态数组的值......话虽如此,问题就像如果将初始化移到定义中,则很难:)

标签: c++ templates variadic-templates unpack


【解决方案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_const 和 size_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... 放回去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多