直接上代码如下
知识点
- enum hack
- next M and next N
- 模板特化
- 模板默认参数
- printt不相关,
// 测试可变模板
void printt()
{
}
template<typename T, typename...Types>
void printt(const T& n, const Types&... args)
{
std::cout << n << std::endl;
printt(args...);
}
template<int n, int m>
struct nextN
{
enum
{
value = (n % m != 0)* n
};
};
template<int n, int m>
struct nextM
{
enum
{
value = m*m > n ? -1 : m+1
};
};
template<int n, int m=2>
struct testN
{
enum
{
value = testN<nextN<n, m>::value, nextM<n, m>::value>::value
};
};
template<int n>
struct testN<n, -1>
{
enum
{
value = true
};
};
template<int m>
struct testN<0, m>
{
enum
{
value = false
};
};
int main()
{
std::cout << "nextN: " << std::endl;
std::cout << nextN<16, 8>::value << std::endl;
std::cout << nextN<8, 2>::value << std::endl;
std::cout << nextN<7, 2>::value << std::endl;
std::cout << "-----------------" << std::endl;
std::cout << testN<100, 2>::value << std::endl;
std::cout << testN<99, 2>::value << std::endl;
std::cout << testN<97, 2>::value << std::endl;
std::cout << "-----------------" << std::endl;
std::cout << testN<100>::value << std::endl;
std::cout << testN<99>::value << std::endl;
std::cout << testN<97>::value << std::endl;
std::cout << "-----------------" << std::endl;
printt("a", 1, 22.3, "asdfasdf", 'd');
system("pause");
}
参考: https://www.cnblogs.com/devymex/p/3326793.html