C++ 模板模板参数简单示例

C++ 模板模板参数简单示例,c++,c++11,templates,typetraits,template-templates,C++,C++11,Templates,Typetraits,Template Templates,首先,我学习了模板参数,我开始怀疑我是否有一个向量,是否可以制作一个模板,从中提取出类型int 但是,在尝试构建一个示例的过程中,我甚至无法使用单个级别的模板参数模板函数 #include <iostream> #include <vector> template< template<class> class C2, class I > void for_2d(const C2<I>& container)

首先,我学习了模板参数,我开始怀疑我是否有一个
向量
,是否可以制作一个模板,从中提取出类型
int

但是,在尝试构建一个示例的过程中,我甚至无法使用单个级别的模板参数模板函数

#include <iostream>
#include <vector>

template< 
    template<class> class C2,
    class I
>
void for_2d(const C2<I>& container) 
{
    for( auto j : container ){
        std::cout << j;
    }
}

int main() {
    std::vector<int> cont;
    for_2d(cont);
    return 0;
}
#包括
#包括
模板<
模板类别C2,
第一类
>
2d(施工指挥与控制和容器)的空隙
{
用于(自动j:容器){

std::cout您缺少的是vector有多个模板参数(大多数都有默认值)。 您需要为此准备您的函数

template< 
    template<class...> class C2,
    class I
>
void for_2d(const C2<I>& container) 
{
    for( auto j : container ){
        std::cout << j;
    }
}
模板<
模板类别C2,
第一类
>
2d(施工指挥与控制和容器)的空隙
{
用于(自动j:容器){

std::cout您缺少的是vector有多个模板参数(大多数都有默认值)。 您需要为此准备您的函数

template< 
    template<class...> class C2,
    class I
>
void for_2d(const C2<I>& container) 
{
    for( auto j : container ){
        std::cout << j;
    }
}
模板<
模板类别C2,
第一类
>
2d(施工指挥与控制和容器)的空隙
{
用于(自动j:容器){

对于Bartosz-Przybylski的答案,这解释了为什么您的示例无法编译,但您需要

从那里提取int类型

您使用的是
auto j:container
,因此您使用的是(至少)C++11;因此我建议您实现一个特定的递归类型traits

我提议如下
firtType
首先,通用(非专用)版本(即递归终端)

此专门化适用于许多容器,但不适用于接收类型和数字的
std::array
;下面是对
std::array

template <template <typename, std::size_t> class C, typename T, std::size_t N>
struct firstType<C<T, N>>
 { using type = typename firstType<T>::type; };
模板
结构第一类型
{using type=typename firstType::type;};
可能需要其他专业

下面是一个完整的工作示例

#include <array>
#include <vector>
#include <type_traits>

template <typename T>
struct firstType
 { using type = T; };

template <template <typename...> class C, typename T0, typename ... Ts>
struct firstType<C<T0, Ts...>>
 { using type = typename firstType<T0>::type; };

template <template <typename, std::size_t> class C, typename T, std::size_t N>
struct firstType<C<T, N>>
 { using type = typename firstType<T>::type; };

int main ()
 {
   std::vector<int>                 vi;
   std::array<long, 42U>            al;
   std::vector<std::vector<short>>  vvs;

   static_assert( std::is_same<typename firstType<decltype(vi)>::type,
                               int>::value, "!" );
   static_assert( std::is_same<typename firstType<decltype(al)>::type,
                               long>::value, "!" );
   static_assert( std::is_same<typename firstType<decltype(vvs)>::type,
                               short>::value, "!" );
 }
#包括
#包括
#包括
样板
结构第一类型
{使用type=T;};
样板
结构第一类型
{using type=typename firstType::type;};
样板
结构第一类型
{using type=typename firstType::type;};
int main()
{
std::向量vi;
std::数组al;
std::向量vvs;
静态断言(std::is_same::value,“!”;
静态断言(std::is_same::value,“!”;
静态断言(std::is_same::value,“!”;
}

+1了解Bartosz-Przybylski的答案,这解释了为什么您的示例无法编译,但您需要

从那里提取int类型

您使用的是
auto j:container
,因此您使用的是(至少)C++11;因此我建议您实现一个特定的递归类型traits

我提议如下
firtType
首先,通用(非专用)版本(即递归终端)

此专门化适用于许多容器,但不适用于接收类型和数字的
std::array
;下面是对
std::array

template <template <typename, std::size_t> class C, typename T, std::size_t N>
struct firstType<C<T, N>>
 { using type = typename firstType<T>::type; };
模板
结构第一类型
{using type=typename firstType::type;};
可能需要其他专业

下面是一个完整的工作示例

#include <array>
#include <vector>
#include <type_traits>

template <typename T>
struct firstType
 { using type = T; };

template <template <typename...> class C, typename T0, typename ... Ts>
struct firstType<C<T0, Ts...>>
 { using type = typename firstType<T0>::type; };

template <template <typename, std::size_t> class C, typename T, std::size_t N>
struct firstType<C<T, N>>
 { using type = typename firstType<T>::type; };

int main ()
 {
   std::vector<int>                 vi;
   std::array<long, 42U>            al;
   std::vector<std::vector<short>>  vvs;

   static_assert( std::is_same<typename firstType<decltype(vi)>::type,
                               int>::value, "!" );
   static_assert( std::is_same<typename firstType<decltype(al)>::type,
                               long>::value, "!" );
   static_assert( std::is_same<typename firstType<decltype(vvs)>::type,
                               short>::value, "!" );
 }
#包括
#包括
#包括
样板
结构第一类型
{使用type=T;};
样板
结构第一类型
{using type=typename firstType::type;};
样板
结构第一类型
{using type=typename firstType::type;};
int main()
{
std::向量vi;
std::数组al;
std::向量vvs;
静态断言(std::is_same::value,“!”;
静态断言(std::is_same::value,“!”;
静态断言(std::is_same::value,“!”;
}

Try vector::value\u type-无需使其复杂化。Try vector::value\u type-无需使其复杂化。