调用模板化基函数的更短方式

时间:2017-06-04 14:10:58

标签: c++ c++11 templates inheritance

我知道这个问题的答案可能只是“不”,但我希望如果它是“不”,那么我会得到一个不同的做法的建议。 请考虑以下事项:

class IFoo
{
public:
    virtual void Foo() = 0;
};

class IBar : public virtual IFoo
{
public:
    virtual void Bar1() = 0;
    virtual void Bar2() = 0;
};

template <typename T>
class BaseFoo : public T
{
public:
    virtual void Foo() override
    {
        std::cout << "Common behavior Foo" << std::endl;
    }
};

template <typename T>
class BaseBar1 : public T
{
public:
    virtual void Bar1() override
    {
        std::cout << "Common behavior Bar1" << std::endl;
    }
};

现在在我的班级中,我想使用Foo的基础实现,并且仅在某些情况下使用Bar1的基本实现。所以我很自然地从BaseFoo1<BaseBar1<IBar>>继承而且在我的班级Bar1中,我会有时(或者甚至所有时间,如果它是有意义的)称呼基地。

class MyClass : public BaseFoo<BaseBar1<IBar>>
{
public:
    void Bar1() override
    {
        if(SomeCondition())
        {
            std::cout << "MyClass Bar1" << std::endl;
        }
        else
        {
            BaseFoo<BaseBar1<IBar>>::Bar1(); 
        }
    }
    void Bar2() override {}
    bool SomeCondition() { return false;}
};

我感兴趣的是,知道是否有某种方法可以缩短对基本功能的调用。 我考虑使用decltype(this)(或std::decay<decltype(this)>),然后我搜索一种使用模板元编程来获取基本类型的方法,但我找不到任何有用的东西。

1 - 有没有办法缩短对模板化基数的调用?

2 - 对设计有何评论?

我在我的项目中使用C ++ 11,但是对C ++ 17的任何建议都会很好。

0 个答案:

没有答案