Как разбить модуль на несколько файлов

Я читал о модулях на C ++ и кое-что не понимаю, как это сделать. Интересно, как можно эффективно разделить модуль C ++ на несколько файлов с помощью текущего предложения объединенного модуля.

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

Я представил себе что-то вроде этого:

interface.ixx:

export module MyModule;

export namespace MyLib {
    struct A {
        void doStuff();
    };

    struct B {
        A myA;
        void otherStuff();
    };
}

Затем я хотел бы реализовать свои классы следующим образом:

A.ixx:

module MyModule;

// import self??

MyLib::A::doStuff() {
    // stuff...
}

B.ixx

module MyModule;

// import self again??

MyLib::B::otherStuff() {
    myA.doStuff();
}

Что я хочу знать: знает ли модуль, независимо от файла, свой интерфейс? Если нет, есть ли другой способ разбить модуль на несколько файлов? Я знаю, что в этом случае это может показаться глупым, но с большими классами в большом модуле было бы заманчиво держать вещи разделенными.


person Guillaume Racicot    schedule 26.08.2016    source источник
comment
Неактуально, но в последний раз, когда я проверял, что модули не относятся к C ++ 17, что-то изменилось?   -  person 101010    schedule 26.08.2016
comment
@ 101010 Нет, модули все еще вышли из C ++ 17, но могут быть добавлены в C ++ 20. Извините за вводящий в заблуждение тег, я удалю его.   -  person Guillaume Racicot    schedule 26.08.2016
comment
Или это может быть снова пропущено в 2020 году. Вместо того, чтобы смотреть в хрустальный шар в течение следующих 4 лет и искать ответы, которые являются не чем иным, как фантастическими дикими догадками, учтите, что практически любой компилятор C ++ уже поддерживает это сегодня. И знаете, как решить эту проблему. Они просто не делают этого по-другому. Вы не сможете получить полезный ответ, пока не назовете свой.   -  person Hans Passant    schedule 26.08.2016
comment
Вот почему я упомянул текущую TS, так как окончательная реализация модулей, которые будут добавлены в c ++, с большой вероятностью будет похожа на текущую TS.   -  person Guillaume Racicot    schedule 26.08.2016


Ответы (1)


В предложении по объединенному модулю, [module.unit] / 8:

объявление-модуля, которое не содержит ни export, ни раздел-модуль, неявно импортирует первичный модуль интерфейса модуля, как если бы с помощью объявления-импорта-модуля < / em>.

Это означает, что модуль реализации модуля неявно импортирует первичный интерфейс модуля.

person Guillaume Racicot    schedule 27.02.2019