我正在尝试构建一个涉及从同一个基数继承多次的实用程序,我正在通过对整数进行模板化来使基数不同。不幸的是,我发现自己写了以下内容:
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
?
(任何有关更好标题的想法也表示赞赏)
答案 0 :(得分:3)
如果层次结构不必是平的,那么:
#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的在线演示。
答案 1 :(得分:1)
一些递归继承有什么问题?
template<size_t I>
struct X {};
template<size_t I>
struct InheritFromX : X<I> , InheritFromX <I-1> {};
template<>
struct InheritFromX<0> {};
struct Mystruct : InheritFromX<3> { } // inherits X 3 times