我正在尝试构建一个涉及多次从同一基数继承的实用程序,我正在通过对整数进行模板化以使基数不同来实现。不幸的是,我发现自己写了如下内容:
template<size_t I>
struct X {};
template<size_t Len>
struct Y { static_assert(false, "exceeded max length"); };
template<>
struct Y<0> {};
template<>
struct Y<1> : X<0> {};
template<>
struct Y<2> : X<0>, X<1> {};
template<>
struct Y<3> : X<0>, X<1>, X<2> {};
虽然这在过去的讨厌的 C++ 时代曾经是一种非常常见的模式,但我不禁觉得可以在 C++11 中做得更好,尽管细节让我难以理解。
对于任意 Len
,这可以简洁地完成吗?
(也欢迎任何关于更好标题的想法)
最佳答案
如果层次结构不必是扁平的,那么:
#include <iostream>
#include <iomanip>
#include <type_traits>
template<size_t N> struct X : X<N - 1> {};
template<> struct X<0> {};
template<size_t N>
struct Y : X<N - 1> {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_base_of<X<0>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<1>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<2>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<3>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<4>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<5>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<6>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<7>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<8>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<9>, Y<10>>::value << "\n"; // true
std::cout << std::is_base_of<X<10>, Y<10>>::value << "\n"; // false
}
查看在线演示 http://ideone.com/wsgAhQ .
关于c++ - 在可变数量的标记碱基上进行模板化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700611/