Đầu tiên, tôi thực sự không gặp vấn đề gì, nhưng tôi muốn giữ mọi thứ càng đơn giản càng tốt. Tôi đang sử dụng một lớp templated tên là Math
và bên cạnh rất nhiều công cụ khác có chức năng ngẫu nhiên.Chức năng tĩnh không có khuôn mẫu trong lớp templated
Các loại hàm ngẫu nhiên khác nhau và một hàm để đặt hạt giống ngẫu nhiên. Vì vậy, mọi chức năng ngoại trừ chức năng hạt giống sử dụng loại class Real
. Nhưng khi tôi muốn thiết lập các hạt giống tôi phải vượt qua một số ngẫu nhiên (haha) gõ để có thể gọi hàm:
Math<u32>::SeedRandom(System::time());
Một lần nữa đây không phải là một vấn đề thực sự, nhưng tôi tò mò nếu nó có thể nhận được kết quả tương tự mà không cần sử dụng <u32>
.
Dưới đây là một đoạn trích từ lớp Math:
template <class Real>
class Math
{
public:
static void SeedRandom(u32 seed) { srand(seed); }
static Real UnitRandom() { return (Real)((f64)rand()/(f64)RAND_MAX); }
};
btw. f64
được nhập vào double
và u32
đến unsigned int
.
Vâng, một đối tượng đơn lẻ để gọi chức năng đó sẽ là có thể, nhưng trong trường hợp đó nó sẽ thực sự xấu xí :) Chỉ muốn biết nếu có cách để mã hóa nó, do đó không cần phải xác định loại. Tôi đã thử một chút và có thể gọi nó như thế này 'Math :: SeedRandom ((u32) System :: time()); '. Điều này ít nhất sẽ hiển thị, rằng loại không được sử dụng, nhưng nó chỉ làm cho thời gian biên dịch không cần thiết lâu hơn, và nó thậm chí còn xấu xí hơn sau đó chỉ cần gọi với ''. –
v01pe
@ v01pe: sử dụng 'void *' trong ý kiến sai lệch thiên vị của tôi sẽ không bao giờ ngụ ý rằng loại s không được sử dụng. IMO, như tôi đã nói, chức năng freestanding là giải pháp tốt nhất. Các hàm tự do KHÔNG theo bất kỳ cách nào mâu thuẫn với mô hình của OOP trong C++ –
Tất nhiên bạn đang đúng, sử dụng 'void *' không hàm ý điều đó! – v01pe