1

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

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吗?

(也感谢任何关于更好标题的想法)

4

2 回答 2

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上的在线演示。

于 2013-05-22T20:14:34.050 回答
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
于 2013-05-22T20:12:59.783 回答