我想在派生类中使用模板方法从基类覆盖虚方法;只是想知道是否有任何聪明的方法或努力使这成为可能。
#include <iostream>
using namespace std;
struct A
{
virtual void AF(int i)
{
std::cout << "Function in A" << std::endl;
}
virtual void af(int i)
{
std::cout << "Function in A" << std::endl;
}
};
struct B
{
virtual void BF(int i)
{
std::cout << "Function in B" << std::endl;
}
virtual void bf(int i)
{
std::cout << "Function in B" << std::endl;
}
};
template<bool IS_A>
struct C : public A, public B
{
template<class I>
typename std::enable_if<std::is_same<int, I>::value && IS_A,void>::type AF(I i)
{
std::cout << "Function override from A in C" << std::endl;
}
template<class I>
typename std::enable_if<std::is_same<int, I>::value && !IS_A,void>::type BF(I i)
{
std::cout << "Function override from B in C" << std::endl;
}
template<class I>
void af(I i)
{
std::cout << "Function override from A in C" << std::endl;
}
template<class I>
void bf(I i)
{
std::cout << "Function override from B in C" << std::endl;
}
};
int main() {
int i(0);
{
A * a = new C<true>();
a->AF(i);
a->af(i);
}
{
B * b = new C<false>();
b->BF(i);
b->bf(i);
}
return 0;
}
输出是:
感谢。
答案 0 :(得分:0)
您可以使用CRTP惯用法来执行此操作:
<rule name="SpecsSpiderCrawl" stopProcessing="true">
<match url="(\/\/.*\/)(.*)\?" />
<conditions>
<add input="{QUERY_STRING}" pattern="specs=.*" />
</conditions>
<action type="Redirect" url="http://{HTTP_HOST}/{R:2}" appendQueryString="false" redirectType="Permanent" />
</rule>
答案 1 :(得分:0)
首先,启用/禁用&#34;根据{{1}}的成员函数,您只需定义C的IS_A
和true
特化:
false
要介绍模板的覆盖,您可以覆盖A和B中的模板,其中您可以调用模板:
template <bool IS_A>
struct C;
template <>
struct C<true> : A, B
{
// functions only defined for IS_A == true
};
template <>
struct C<false> : A, B
{
// functions only defined for IS_A == false
}