C++ 生成编译时整数范围时类型不完整
生成编译时整数范围时遇到问题。这是我的代码:C++ 生成编译时整数范围时类型不完整,c++,templates,C++,Templates,生成编译时整数范围时遇到问题。这是我的代码: #include<type_traits> #include<iostream> using namespace std; // this is needed because I'm using vs2013 template<typename T, T...Seq> struct integer_sequence{ using type = integer_sequence<T, Seq...&g
#include<type_traits>
#include<iostream>
using namespace std;
// this is needed because I'm using vs2013
template<typename T, T...Seq>
struct integer_sequence{
using type = integer_sequence<T, Seq...>;
};
template<typename T>
struct ToMemberType {
using type = T;
};
template<typename TTest, typename TCount, typename TResult>
struct ImplMakeIntegerRange;
template<typename T, T Begin, T End, T...Seq>
struct ImplMakeIntegerRange<
integer_sequence<T, Begin>,
integer_sequence<T, End>,
integer_sequence<T, Seq...>
>
:
conditional<
is_same<
integer_sequence<T, Begin>,
integer_sequence<T, End>
>::value,
integer_sequence<T, Seq...>,
ToMemberType <
ImplMakeIntegerRange<
integer_sequence<T, Begin>,
integer_sequence<T, End - 1>,
integer_sequence<T, End - 1, Seq...>
>
>
>::type {
static_assert(Begin <= End, "Begin <= End failed");
};
template<typename T, T Begin, T End>
using make_integer_range =
typename ImplMakeIntegerRange <
integer_sequence<T, Begin>,
integer_sequence<T, End>,
integer_sequence < T >
>::type;
// the code below is to test if make_integer_range really works.
template<typename T>
struct PrintIntegerRange;
template<typename T, T...Seq>
struct PrintIntegerRange<integer_sequence<T, Seq...>>{
public:
static void Print() {
for (auto a : { Seq... }) {
cout << a << ' ';
}
cout << endl;
}
};
int main()
{
//I expect this two print the same result.
PrintIntegerRange<integer_sequence<int, 3, 4, 5>>::Print();
PrintIntegerRange<make_integer_range<int, 3, 6>>::Print(); //got three error here.
}
#包括
#包括
使用名称空间std;
//这是必需的,因为我使用的是vs2013
样板
结构整数序列{
使用类型=整数\u序列;
};
样板
结构ToMemberType{
使用类型=T;
};
样板
结构IMPLMAKEINTEGERRARGE;
样板
结构IMPLMAKEINTEGERRARGE<
整数_序列,
整数_序列,
整数序列
>
:
有条件的<
你也一样吗<
整数_序列,
整数序列
>::价值,
整数_序列,
多模体<
恳求<
整数_序列,
整数_序列,
整数序列
>
>
>::类型{
静态断言(开始)
>::类型;
//下面的代码是为了测试make_integer_range是否真的有效。
样板
结构打印集成;
样板
结构打印集成{
公众:
静态无效打印(){
对于(自动a:{Seq…}){
cout我认为问题在于ToMemberType结构的使用。您必须将其从ImplMakeIntegerRange定义中删除,或者像这样提取其模板参数类型
template<typename T, T Begin, T End, T...Seq>
struct ImplMakeIntegerRange<
integer_sequence<T, Begin>,
integer_sequence<T, End>,
integer_sequence<T, Seq...>
>
:
conditional<
is_same<
integer_sequence<T, Begin>,
integer_sequence<T, End>
>::value,
integer_sequence<T, Seq...>,
typename ToMemberType <
ImplMakeIntegerRange<
integer_sequence<T, Begin>,
integer_sequence<T, End - 1>,
integer_sequence<T, End - 1, Seq...>
>
>::type
>::type {
static_assert(Begin <= End, "Begin <= End failed");
};
模板
结构IMPLMAKEINTEGERRARGE<
整数_序列,
整数_序列,
整数序列
>
:
有条件的<
你也一样吗<
整数_序列,
整数序列
>::价值,
整数_序列,
typename ToMemberType<
恳求<
整数_序列,
整数_序列,
整数序列
>
>::类型
>::类型{
静态断言(开始时缺少一个::在PrintIntegerRange
的整数序列之后键入?也请不要使用命名空间std;
@erenon整数序列和整数序列::type
实际上是相同的类型。只有最后一行阻止代码编译。