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-无需使其复杂化。