定义一个出现在多个名称空间中的函数

时间:2013-08-09 12:01:02

标签: c++ namespaces function-declaration

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

因此,我非常宁愿在一个地方而不是在每个单独的命名空间中定义一个函数。

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

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"
}

有没有更好的方法来做到这一点,任何人都可以想到?

2 个答案:

答案 0 :(得分:3)

使其成为抽象基类中的虚函数。无论何时在派生类中实现它,都要实现它。

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

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

答案 1 :(得分: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中结束......无论如何,除非你试图为任何硬件/系统设置一个lib(在我看来这是毫无意义的)。