Как получить одно и то же определение заголовка в двух разных пространствах имен (но записанных один раз) с разными реализациями для пространств имен? - PullRequest
1 голос
/ 27 сентября 2019

Допустим, моя программа состоит из двух компонентов доверенных и ненадежных .Мне бы хотелось, чтобы код класса A был объявлен только один раз, но в двух разных пространствах имен, но их реализация может отличаться в зависимости от пространства имен, при этом только один раз кодируется общий API.Я не хочу использовать макросы для реализаций, таких как #ifdef UNTRSUTED .etc.

Я не хочу использовать абстракции и наследование для достижения различного поведения.Мне просто любопытно, если это возможно.

В заголовке Ах у меня будет

// 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-trust.cpp (для реализации doDifferentFoo для доверенного пространства имен)

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Полагаю, самый простой способ сделать это - переместить общие объявления в дополнительный файл и затем включить его дважды:

A_detail.h:

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

Ах:

#pragma once
namespace app {
    namespace trusted {
        #include "a_detail.h"
    }
    namespace untrusted {
        #include "a_detail.h"
    }
}

A-untrusted.cpp:

#include "a.h"
namespace app { namespace untrusted {
    // ...
} }

A-trust.cpp:

#include "a.h"
namespace app { namespace trusted {
    // ...
} }

A-common_detail.cpp (возможно, выберите другое окончание файла;не должен быть скомпилирован как единица перевода):

// common definitions/declarations without `namespace`

A-common.cpp:

namespace app {
    namespace untrusted {
        #include "A-common_detail.cpp"
    }
    namespace trusted {
        #include "A-common_detail.cpp"
    }
}

Я не уверен, что это того стоит.В качестве альтернативы вы можете (в каждом файле с общим кодом) использовать макрос для всего общего кода и дважды вызывать его для двух пространств имен.Однако вы сказали, что не хотите использовать макросы.

Нет способа сделать это без помощи препроцессора, потому что каждое объявление (только с одним декларатором) объявляет ровно одно имя в одной области видимости..

0 голосов
/ 27 сентября 2019

// Ах

class A {
    void doDifferentFoo();

    void doCommonBar()
    { // ...
    }

};

// A_trusted.h

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

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

}
}

// A_untrusted.h

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

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

}        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...