C++ 如何在两个不同的名称空间(但只编写一次)中使用不同的名称空间实现实现相同的头定义?

C++ 如何在两个不同的名称空间(但只编写一次)中使用不同的名称空间实现实现相同的头定义?,c++,namespaces,C++,Namespaces,假设我的程序包含两个组件受信任的和不受信任的。我希望只需在两个不同的名称空间中对类A的声明编写一次代码,但是它们的实现可以根据名称空间的不同而有所不同,只需对公共API编写一次代码。我不想将宏用于#ifdef untsuted等实现 我不想使用抽象和继承来实现不同的行为。我只是好奇这是否可能 在标题A.h中,我将 // A.h #pragma once namespace app { // I know I can't get what I want with naming the same

假设我的程序包含两个组件受信任的不受信任的。我希望只需在两个不同的名称空间中对类A的声明编写一次代码,但是它们的实现可以根据名称空间的不同而有所不同,只需对公共API编写一次代码。我不想将宏用于
#ifdef untsuted
等实现

我不想使用抽象和继承来实现不同的行为。我只是好奇这是否可能

在标题A.h中,我将

// A.h
#pragma once
namespace app {
 // I know I can't get what I want with naming the same namespace twice
 namespace untrusted, trusted {
  class A {
    doDifferentFoo();
    doCommonBar() // this one is common between two impls;
  }
 }
}

在实现中,我将使用A-common.cpp(只为两个名称空间实现一次公共接口)、A-untrusted.cpp(为不受信任的名称空间实现doDifferentFoo)和A-trusted.cpp(为受信任的名称空间实现doDifferentFoo)

我想最简单的方法是,是将通用声明移动到一个额外文件中,然后将其包含两次:

A_详情。h:

// No `#pragma once` here!
class A {
    doDifferentFoo();
    doCommonBar(); // this one is common between two impls;
};
A.h:

A-untrusted.cpp:

#include "a.h"
namespace app { namespace untrusted {
    // ...
} }
#include "a.h"
namespace app { namespace trusted {
    // ...
} }
A-trusted.cpp:

#include "a.h"
namespace app { namespace untrusted {
    // ...
} }
#include "a.h"
namespace app { namespace trusted {
    // ...
} }
A-common_detail.cpp(可能选择不同的文件结尾;不应编译为翻译单位):

A-common.cpp:

namespace app {
    namespace untrusted {
        #include "A-common_detail.cpp"
    }
    namespace trusted {
        #include "A-common_detail.cpp"
    }
}
我不确定这是否值得。或者,您可以(在具有公共代码的每个文件中)对所有公共代码使用一个宏,并对两个名称空间调用该宏两次。但是,您确实说过不想使用宏

没有预处理器的帮助是无法做到这一点的,因为每个声明(只有一个声明器)在一个范围内只声明一个名称。

/A.h

class A {
    void doDifferentFoo();

    void doCommonBar()
    { // ...
    }

};
//A_.h

namespace app
{
namespace trusted
{
#include "A.h"

void A::doDifferentFoo() // can be moved to cpp-file if needed/wanted
{
}

}
}
//A_不可信

namespace app
{
namespace untrusted
{
#include "A.h"

void A::doDifferentFoo() // can be moved to cpp-file if needed/wanted
{
}

}        
}

doDifferentFoo
的两种实现有多大不同?条件编译可以工作吗?或者您可以提供一个两个类都从中继承的公共基类来处理公共内容吗?