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++ の昔の非常に一般的なパターンでした。

任意の場合、これを簡潔に行うことはできます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 に答える