Как объяснено в этом ответе создание экземпляров шаблонов позволяет сократить время и размеры компиляции, не требуя перекомпиляции шаблонов для каждого нового типа в каждом новом файле, который их использует.
Я также рад тому, как модули 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» , но для этой установки требуется Копирование интерфейсов дважды, что похоже на то, что система модулей может сделать для нас.