c – 在可变参数模板参数中混合类型和非类型?

是否可以在可变参数模板参数中混合类型和非类型?如果我将std :: array作为参数T传递给这个类,我还需要为数组传递一个类型和一个长度,但是我在下面尝试它的方式在遇到值时会导致错误,因为它只需要类型的类型:

template <
    template<class, std::size_t>  class T,
    class ... Types>
class C {

    T<Types...> storage;
};

int main(){
    C<std::array, int, 3> c;
}

错误信息:

error: template argument for template type parameter must be a
      type
    Container<std::array, int, 3> c;
                               ^

有没有办法在可变参数上下文中传递类型和值?

最佳答案
正如我所看到的,你可以硬编码类T必须作为模板参数的参数的数量和类型.这里不需要可变参数模板.只需这样做:

template <
    template<class, std::size_t>  class T,
    class A, std::size_t N>
class C {

    T<A, N> storage;
};

int main(){
    C<std::array, int, 3> c; // works!
}

如果您希望使用可变参数模板,那么也将它放在模板模板参数中:

template <
    template<typename...>  class T,
    typename... Types>
class C {

    T<Types...> storage;
};

如果您希望使用该版本但仍希望使用std :: array,则可以为已具有大小的std :: array创建别名:

template<typename T>
using array3 = std::array<T, 3>;

C<array3, int> c;

或者,您也可以创建某种模板模板别名,以便您选择大小:

template<std::size_t n>
struct sized_array {
    template<typename T>
    using array = std::array<T, n>;
};

C<sized_array<5>::array, int>;

转载注明原文:c – 在可变参数模板参数中混合类型和非类型? - 代码日志