如何以constexpr兼容的方式访问可变参数模板参数?

时间:2014-07-16 01:28:56

标签: c++ templates c++11 variadic-templates compile-time

Item是一个模板化的类,使用未知数量的Init模板初始化。

我需要在编译时以某种方式访问​​初始化数据。它是如何完成的(模板,constexpr ......等等)并不重要。

我可以提出很多方法来存储传入的数据,但是我找不到任何允许稍后编译时访问的方法。

这是我想做的一个例子。理想情况下,variadic()会知道类参数包,并能够访问它。情况似乎并非如此。

还有一点需要注意。我不需要传入参数的值 - 类型就足够了,因为我可以访问我需要的数据,如果我至少可以获得类型。

任何帮助将不胜感激!

头:

template <size_t Size, size_t Count> class Init
{
public:
    static constexpr size_t size()                  { return Size; }
    static constexpr size_t count()                 { return Count; }
};

template<typename ...Args> class A
{
public:
    A(){}

    template <size_t pos> constexpr size_t getSize()
    {
        return variadic<pos>().size();
    }

    template <size_t pos> constexpr auto& variadic(Args&&... args)
    {
        return variadicFind<pos>(std::forward<Args>(args)...);
    }
    template <size_t Index, typename T, typename ...A> constexpr auto& variadicFind(T &&t, A&&... a)
    {
        return Index == 0 ? t : variadicFind<Index - 1>(std::forward<A>(a)...);
    }
};
using Item = A<Init<100, 100>, Init<50, 50>>;

cpp文件:

Item i;
i.getSize<1>();

1 个答案:

答案 0 :(得分:2)

元编程样板。 types捆绑变量arigardic args。 nth_type从包中提取第n个类型。

template<class...>struct types{using type=types;};
template<unsigned N, class types>struct nth_type;
template<template<class...>class types, unsigned N, class T0, class...Ts>
struct nth_type<N, types<T0,Ts...>>:
  nth_type<N-1, types<Ts...>>
{};
template<template<class...>class types, class T0, class... Ts>
struct nth_type<0, types<T0, Ts...>> {
  using type=T0;
};
template<unsigned N, class types>
using nth_type_t=typename nth_type<N,types>::type;

Init中提取您想要的内容的特征。如果您有更多类型要传递给A specialize get_*更多:

template <size_t Size, size_t Count> class Init {};

template<class>struct get_size;
template<size_t S,size_t C>
struct get_size<Init<S,C>>:std::integral_constant<size_t,S>{};
template<class>struct get_count;
template<size_t S,size_t C>
struct get_count<Init<S,C>>:std::integral_constant<size_t,C>{};

并完成:

template<typename ...Args> class A {
public:
  A(){}

  template <size_t pos> constexpr size_t getSize() {
    return get_size<nth_type_t<pos, types<Args...>>>::value;
  }
};