Hỏi để làm rõ một số vấn đề về template trong C++

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?

Template nó được xử lí tại compile time (không phải link-time) nên bắt buộc phải đặt trong header.

Các thư viện như asio, spdlog,… đều phải nhét hết vào header, nhàn cho người dùng nhưng bất tiện khoản size và build.

More:
https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl

1 Like

Boost Lib cũng vậy phải không, thấy toàn là header only, không biết phần mà phải được build trong boost là cái gì.

Boost nó rộng lắm, nó là kiểu tập hợp nhiều thư viện lại với nhau, hầu như là những thư viện có nhiều người dùng, sau đó thu nhập vào boost, thêm namespace boost, như boost::asio từ lib asio.
Vậy nên nếu ban đầu người viết không dùng template thì nó vẫn là link library, như libpng,…

Cám ơn bạn :grinning:
Thất vọng ghê gớm luôn chớ :worried:

1 Like

Đành chịu vậy, cơ mà viết template xong nhét vào 2 nơi, giả sử viết 1 class template xong lại define ở .cpp thì vật vã lắm luôn :grin:

2 anh cho em hỏi nha! boost là gì vậy em tình cờ đọc thấy khá thú vị nhưng mò google thì không thấy mong đc 2 anh chỉ dạy! @MeigyokuThmn @Dark.Hades. Em chân thành cảm ơn!

Boost là một lib khổng lồ gồm nhiều lib nhỏ ở trong đó.
http://www.boost.org
Một số lib đã đc đưa vào trong STL của c++.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?