여기서 의미하는 바는 일부 템플릿 T add(T a, T b) ...
에서 생성 된 코드로 어떻게 이동합니까? 나는 이것을 달성 할 수있는 몇 가지 방법을 생각했다. 우리는 일반 함수를 AST에 저장 Function_Node
한 다음 그것을 사용할 때마다 원래 함수 노드에 자체 유형의 사본으로 저장된 모든 유형의 사본을 원래 함수 노드에 저장 T
한다. 사용 중입니다. 예를 들어 add<int>(5, 6)
대한 일반적인 기능의 사본을 저장합니다 add
및 모든 종류의 대체 T
사본에 와 int
.
따라서 다음과 같이 보일 것입니다.
struct Function_Node {
std::string name; // etc.
Type return_type;
std::vector<std::pair<Type, std::string>> arguments;
std::vector<Function_Node> copies;
};
그런 다음 이들에 대한 코드를 생성 할 수 Function_Node
있으며 사본 목록 을 방문하면 모든 사본 copies.size() > 0
을 호출 visitFunction
합니다.
visitFunction(Function_Node& node) {
if (node.copies.size() > 0) {
for (auto& node : nodes.copies) {
visitFunction(node);
}
// it's a generic function so we don't want
// to emit code for this.
return;
}
}
이것이 잘 작동합니까? 최신 컴파일러는이 문제에 어떻게 접근합니까? 아마도이 작업을 수행하는 또 다른 방법은 사본을 AST에 주입하여 모든 의미 단계를 거치도록 할 수 있다고 생각합니다. 예를 들어 Rust의 MIR 또는 Swifts SIL과 같은 즉각적인 형태로 생성 할 수 있다고 생각했습니다.
내 코드는 Java로 작성되었으며 여기 예제는 C ++입니다. 예제에 대한 설명은 조금 덜 장황하지만 원칙은 기본적으로 동일합니다. 질문 상자에 손으로 작성 되었기 때문에 약간의 오류가있을 수 있습니다.
이 문제에 접근하는 가장 좋은 방법과 마찬가지로 최신 컴파일러를 의미합니다. 그리고 제네릭을 말할 때 유형 삭제를 사용하는 Java 제네릭과 같은 의미는 아닙니다.