64,654
社区成员
发帖
与我相关
我的任务
分享
template <int size>
class A //有一个模板
{
char arr[size];
}
template <>
class A<0> //size为0的特化
{
char arr[1];
}
template <>
class A</*能不能有一种方法可以按区间特化,比如 (<= 0) || (>= 0xffff) */>
{
char arr[1];
}
template <>
class A</*比如 (1000 <=) && (<= 9999)*/>
{
char arr[4];
}
template <size_t size>
class A //有一个模板
{
char arr[size<= 0 || size >= 0xffff ? 1
: (size>=1000 && size<=9999 ? 4
: size)];
}
这里面数据类型用得是size_t,因此不会出现负数的情况。如果想对于一些特殊值报错的话,可以用static_assert。
template <int size,bool isSizeInRange=(size>0)>
class A //有一个模板
{
char arr[size];
}
template <int size>
class A<size,false>
{
...............
}
template <int size>
class A<size,false>
{
...............
}
template <int size>
class A<size,true>
{
...............
}
int main()
{
A<100> a;
return 1;
}
#include <iostream>
using namespace std;
struct ZeroTag{};
struct InvalidTag{};
struct GeneralTag{};
struct GeneralTag1{};
template <int size, typename Tag>
class A;
template <int size>
class A<size, ZeroTag>
{
char arr[1];
public:
void show(){cerr<<1<<endl;}
};
template <int size>
class A<size, InvalidTag>
{
char arr[1];
public:
void show(){cerr<<2<<endl;}
};
template <int size>
class A<size, GeneralTag>
{
char arr[size];
public:
void show(){cerr<<3<<endl;}
};
template <int size>
class A<size, GeneralTag1>
{
char arr[4];
public:
void show(){cerr<<4<<endl;}
};
template<bool flag, typename A, typename B>
struct the_if;
template<typename A, typename B>
struct the_if<true, A, B>
{
typedef A result_type;
};
template<typename A, typename B>
struct the_if<false, A, B>
{
typedef B result_type;
};
template<int size>
struct Helper
{
typedef typename the_if<size==0, ZeroTag,
typename the_if<(size<= 0 || size >= 0xffff), InvalidTag,
typename the_if<(size>=1000&&size<=9999), GeneralTag1, GeneralTag>::result_type
>::result_type
>::result_type
the_tag;
typedef A<size, the_tag> ResultType;
};
int main()
{
Helper<0>::ResultType test0;
Helper<1>::ResultType test1;
Helper<0x10000>::ResultType test2;
Helper<-1>::ResultType test3;
Helper<1000>::ResultType test4;
test0.show();
test1.show();
test2.show();
test3.show();
test4.show();
return 0;
}