Giờ nếu mình có 2 file, 1 header 1 cpp, và mình viết template kiểu này:
// header.h
template <typename Func>
void RunCallback(Func callback);
// implement.cpp
template <typename Func>
void RunCallback(Func callback)
{
callback();
}
Không build được, lỗi unresolve symbol.
Giải pháp là đưa hẳn nội dung cpp vào trong header luôn (header only), hoặc header include implement ở cuối header, hoặc sử dụng template instantiation (cách này là chuốc khổ vào thân, nếu có 100 type thì…).
Vậy vấn đề là liệu khi dùng template rồi thì có tách biệt được declaration và implementation được không?
Người ta thường hay viết library, phân phối ở dạng file .lib, hoặc file .dll và kèm file header chỉ có declaration.
Liệu có thể sử dụng template để viết được library như vậy không, khi mà phải compile thì từ template mới sinh ra được code?
Liệu có thể viết một lib chứa hàm số này:
template <typename Func>
void RunCallback(Func callback);
Rồi đưa header (chỉ có declaration) + lib/dll (chứa implement dạng mã máy) cho người ta dùng, gọi hàm RunCallback rồi đưa vào bất kì kiểu dữ liệu nào phù hợp không? Hay đây là điều bất khả thi (không thể viết ‘phần mềm mã nguồn đóng’ bằng template?