如何将多态参数实现到多个接口?

时间:2016-05-13 06:56:56

标签: c++ c++11 interface polymorphism code-reuse

给定一些基接口A,B,C .... N

一些假设的类实现了它们的一组:

Month Table
 id     Name
 1      Jan
 2      Feb
 3      March
 5      April

我想创建一个函数,它接受一个对象(或指向对象的指针)参数给一个包含的类,比如A和B.

class MyClass1: public A, public B, public N;
class MyClass2: public A, public B, public D;

从C ++程序员的角度来看,这看起来很荒谬。从软件架构师的角度来看,这似乎是所有语言应该拥有的基本集团。

是否有任何技巧(模板除外)或解决方案?

注意:大多数接口不是来自我,因此(原则上)不可能在接口上进行更改。

EDITED: 这里有一些例子:

void myFunc( A&B obj );

4 个答案:

答案 0 :(得分:4)

#include <type_traits>

using namespace std;

class A{};
class B{};

template<class T, enable_if_t<is_same<A, decay_t<T>>::value || is_same<B, decay_t<T>>::value, int> = 0>
void some_function(T&& a_or_b) {}

直播:https://godbolt.org/g/Z1MV8w

此示例需要c ++ 14,但如果您需要11兼容性,则可以使用enable_if。它只是不那么可读。

如果您想接受任何继承自A或B的内容,请使用is_base_of代替is_same

答案 1 :(得分:3)

你真正要求的是编译器创建一个中间类型(A&amp; B),其接口包含 interface A和< em> interface B。然后允许任何实现两者这些接口的类型绑定到此组合类型的引用。

我甚至不确定你如何在语法中引用这样的格式塔类型:

void func((A+B)& var); // ???

你可以使用当前语法做类似的事情而不需要编译器在幕后创建脚手架,只需简单地接受参数两次

struct A { void stuff(){ std::cout << "A\n"; } };
struct B { void stuff(){ std::cout << "B\n"; } };
struct C { void stuff(){ std::cout << "C\n"; } };

struct MyType: A, B, C
{
    void stuff() { std::cout << "MyType\n"; }
};

void func(A& a, B& b) // accept both interfaces in func
{
    a.stuff(); // use interface A
    b.stuff(); // use interface B
}

int main()
{
    MyType m;

    func(m, m); // pass both interfaces to func()
}

答案 2 :(得分:1)

我投了xaxxon回答,
但是你想在&#34;虚拟&#34;这样,
你可以做扩展AB的课程。

看起来像这样:

class A;
class B;
class A_B: public A, public B{
};

class MyClass1: public A_B, public XXX{
};

class MyClass2: public A_B, public YYY{
};

void myFunc( A_B obj );

我同意这看起来很像Java。

答案 3 :(得分:1)

减轻模板缺点的一种方法

 <script>
 $(document).ready(function(){
     $( "#EmpBirthdate" ).datepicker({
        dateFormat: 'yy-mm-dd',
        showOn: "button",
        buttonImage: "images/calendar.gif",
        buttonImageOnly: true,
        changeMonth: true,
        changeYear: true,
        yearRange: "-30"
    });
 });
 </script>
  

1)强制定义在标题中,难以维护

您只需在标头中转发: 代码很短。

  

2)难以用多态指针管理,

只要您参考或指针,这部分如果模板确定。

  

4)像虚拟这样的其他功能很难或不可能吗?

确实,模板方法不能是模板,但在这里,你可以转发到虚拟方法。

  

5)代码很难检查,因为只有在使用阶段才会出现问题。

您确实要将其实例化以查看所有错误。