我知道这个问题的答案可能只是“不”,但我希望如果它是“不”,那么我会得到一个不同的做法的建议。 请考虑以下事项:
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的任何建议都会很好。