c_cpp 使用C ++ 11模板模板参数通过链接继承添加伪方面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用C ++ 11模板模板参数通过链接继承添加伪方面相关的知识,希望对你有一定的参考价值。

#include <iostream>

/*=======================================================================
 * ASPECT COMPOSITION
 *======================================================================*/
 
template<class Parent>
struct Nil_aspect: public Parent
{
    void tell() {} // no-op, and ends the chain
};

template<class Parent, template<class> class ...Aspects> class Aspect_composer;

template<class Parent, template<class> class Aspect>
class Aspect_composer<Parent, Aspect>: public Aspect< Nil_aspect<Parent> > {};

template<class Parent, template<class> class FirstAspect, template<class> class ...OtherAspects>
class Aspect_composer<Parent, FirstAspect, OtherAspects...>: public FirstAspect< Aspect_composer<Parent, OtherAspects...> > {};

template<class Parent>
class Aspect1: public Parent
{
public:
    Aspect1() { std::cout << "Aspect1 here" << std::endl; }
    
    void tell() { 
        std::cout << "Hello from Aspect1" << std::endl;
        Parent::tell();
    }
};

template<class Parent>
class Aspect2: public Parent
{
public:
    Aspect2() { std::cout << "Aspect2 here" << std::endl; }
    void tell() { 
        std::cout << "Hello from Aspect2" << std::endl;
        Parent::tell();
    }
};

template<class Parent>
class Aspect3: public Parent
{
public:
    Aspect3() { std::cout << "Aspect3 here" << std::endl; }
    void tell() { 
        std::cout << "Hello from Aspect3" << std::endl;
        Parent::tell();
    }
};

class My_base {
public:
    My_base() { std::cout << "My_base here" << std::endl; }
};

class My_class: public Aspect_composer<My_base, Aspect1, Aspect2, Aspect3>
{
};

int main()
{
    My_class obj;
    
    obj.tell();
    
    std::cout << std::endl << "Press RETURN to terminate" << std::endl;
    char dummy; std::cin >> std::noskipws >> dummy;

    return 0;
}

以上是关于c_cpp 使用C ++ 11模板模板参数通过链接继承添加伪方面的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 使用c ++ 11模板快速排序实现

c_cpp C ++ 11竞争性编程模板

C++11之模板别名&函数模板的默认模板参数

c_cpp FibonacciN使用模板

C++11新特性:9—— C++11在函数模板和类模板中使用可变参数

c_cpp C ++模板强制使用函数返回值。