3

可変個引数のテンプレートを使って何ができるか試してみたところ、次のような疑問が生じました。

他のいくつかのクラスをテンプレート パラメーターとして使用できるクラスがあり、それぞれにネストされたクラスがあるとします (nested_class と呼びましょう)。

template<typename... Classes> class MyClass {
    class InnerClass { ... };
};

私が達成したいのは MyClass 内で、ネストされたクラスの各パラメーター クラスから継承するクラスを作成します。

例えば:

class A1 {
public:
    struct nested_class {
        do_stuff() { ... }
    };
};
class A2 {
public:
    struct nested_class {
        do_other_stuff() { ... }
    };
};

using C = MyClass<A1, A2>;

Cには、A1::nested_classとA2::nested_classを継承するネストされたクラスInnerClassがあるという考えです。

そのようなことを達成できるものはありますか?私は個人的に方法を理解できませんが、おそらく可能です。Alexandrescu の Hierarchy Generators (Loki にあります: http://loki-lib.sourceforge.net/html/a00653.html ) のような継承階層ビルダーは役に立ちますか?

誰かがアイデアを持っている場合は、事前に感謝します。

4

1 に答える 1

6

すべてのesInnerClassから派生させるには、パターンを使用する必要があります。nested_classClasses::nested_class...

#include <iostream>
#include <type_traits>

template <class... Classes>
class Myclass
{
public:
    class InnerClass: public Classes::nested_class...
    {

    };
};

class A1 {
public:
    struct nested_class {
        void do_stuff() { /*...*/ }
    };
};
class A2 {
public:
    struct nested_class {
        void do_other_stuff() { /*...*/ }
    };
};

int main()
{
    using Class = Myclass<A1, A2>;

    std::cout << std::is_base_of<A1::nested_class, Class::InnerClass>::value << std::endl;
    std::cout << std::is_base_of<A2::nested_class, Class::InnerClass>::value << std::endl;

    return 0;
}
于 2013-09-20T09:40:18.100 に答える