1

我正在尝试为一组函数和类定义一个通用接口,这些函数和类将具有多个不同的后端实现(使用不同的库)。

因此,我真的更愿意简单地在一个地方而不是在每个单独的命名空间中定义一个函数。

例如,我有一个全局函数:

extern void Func();

现在我想要该功能的 3 个单独的实现。一个是直接的 C,一个是手工编码的汇编器,一个是使用库“x”。

我实际上是在尝试避免执行以下操作:

namespace C
{
     extern void Func();
}

namespace Asm
{
     extern void Func();
}

namespace LibX
{
     extern void Func();
}

有没有很好的模式来避免这样做?当有 100 个奇怪的函数时,它会变得更加痛苦。

我能想到的唯一想法是将所有定义移动到没有头文件保护的头文件中,然后执行:

namespace C
{
     #include "Functions.h"
}

namespace Asm
{
     #include "Functions.h"
}

namespace LibX
{
     #include "Functions.h"
}

有没有人能想到的更好的方法呢?

4

2 回答 2

3

使其成为抽象基类中的虚函数。只要您愿意,就在派生类中实现它。

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

class FooASM:public Foo{
public:
    virtual void bar() const{ ... }
}

等等

于 2013-08-09T12:02:33.040 回答
2

我猜你想要静态多态性 - 意味着模板或宏:

模板:

#include "C_Functions.h"
#include "Asm_Functions.h"
#include "LibX_Functions.h"

enum Namespace 
{
    NamespaceC,
    NamespaceAsm,
    NamespaceLibX
}

template <Namespace> Func();
template <> inline Func<NamespaceC>() { return C_Func(); }
template <> inline Func<NamespaceAsm>() { return Asm_Func(); }
template <> inline Func<NamespaceLibX>() { return LibX_Func(); }

const Namespace NSpace = ...
inline void f() {
    Func<NSpace>()
}

一个优点是:您可能有一个特定功能的通用实现。类似的,你可以用宏做(或者你把它结合起来)我担心它最终会出现在#ifdef ......无论如何,除非你尝试为任何硬件/系统拥有一个库(在我看来这是毫无意义的)。

于 2013-08-09T13:09:55.250 回答