Как использовать шаблон явной реализации с модулями C ++ 20? - PullRequest
3 голосов

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

Я также рад тому, как модули C ++ 20 должны обеспечивать чистое решение для представления шаблонов внешним проектам и уменьшения дублирования hpp / cpp.

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

Например, я ожидаю, что модули будут выглядеть примерно как (непроверенный и, следовательно, вероятно, неправильный код, потому что у меня нет достаточно нового компилятора / я не уверен, что он реализован):

helloworld. cpp

export module helloworld;
import <iostream>;

template<class T>
export void hello(T t) {
    std::cout << t << std::end;
}

helloworld_impl. cpp

export module helloworld_impl;
import helloworld;

// Explicit instantiation
template class hello<int>;

main. cpp

// How to prevent the full definition from being imported here, which would lead
// hello(1) to instantiate a new `hello<int>` instead of reusing the explicit instantiated
// one from `helloworld_impl.cpp`?
import helloworld;

int main() {
    hello(1);
}

и затем компиляция упомянутое в https://quuxplusone.github.io/blog/2019/11/07/modular-hello-world будет вместе (?)

clang++ -std=c++2a -c helloworld.cpp -Xclang -emit-module-interface -o helloworld.pcm
clang++ -std=c++2a -c -fprebuilt-module-path=. -o helloworld_impl.o helloworld_impl.cpp
clang++ -std=c++2a -fprebuilt-module-path=. -o main.out main.cpp helloworld_impl.o

В идеале я также хочу, чтобы определение шаблона можно было использовать во внешних проектах.

Я думаю, что Я хочу, чтобы это был способ импортировать модуль, и во время импорта выберите между:

  • использовать все шаблоны в модуле, как если бы они были только объявлениями (я предоставлю свои собственные экземпляры для другого файл)
  • использовать шаблоны в модуле, как будто это были определения

Это в основном то, чего я добиваюсь до C ++ 20 в «Удалять определения из включенных заголовков, но также открывать шаблоны для внешнего API» , но для этой установки требуется Копирование интерфейсов дважды, что похоже на то, что система модулей может сделать для нас.

...