模仿可变数量的标记碱基

时间:2013-05-22 20:02:05

标签: c++ templates c++11

我正在尝试构建一个涉及从同一个基数继承多次的实用程序,我正在通过对整数进行模板化来使基数不同。不幸的是,我发现自己写了以下内容:

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

,可以这样做吗?

(任何有关更好标题的想法也表示赞赏)

2 个答案:

答案 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