是否可以在派生类中使用模板方法覆盖虚拟方法?

时间:2016-12-16 17:30:20

标签: c++11

我想在派生类中使用模板方法从基类覆盖虚方法;只是想知道是否有任何聪明的方法或努力使这成为可能。

#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;
}

输出是:

  • A中的功能//希望这是C中的A的函数覆盖
  • A中的功能//希望这是C中的A的函数覆盖
  • B中的功能//希望这是C
  • 中B的功能覆盖
  • B中的功能//希望这是C
  • 中B的功能覆盖

感谢。

2 个答案:

答案 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_Atrue特化:

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
}