Trong C++, tôi muốn có một lớp học mà nhà xây dựng như sau:Làm thế nào để kiểm tra xem một loại là một typedef int
class A {
explicit A(A* other) { ... }
explicit A(intptr_t other) { ... }
};
Vấn đề ở đây là nếu người dùng khởi tạo với
A a(0);
Sau đó, trên hệ thống 64 bit, trình biên dịch sẽ phàn nàn rằng không biết liệu 0
có nên được chuyển thành A*
hoặc intptr_t
, đủ công bằng không. Vì tôi muốn ký hiệu đơn giản này hoạt động, tôi đã thêm hàm tạo sau:
explicit A(int a) { assert(a==0); ... }
Xác nhận là vì đây là số nguyên duy nhất có ý nghĩa. Bây giờ, vấn đề phát sinh với một hệ thống 32 bit, trong đó intptr_t
thực sự là ... int
! Vì vậy, bây giờ, hệ thống than phiền có hai nhà xây dựng lấy cùng một kiểu tham số (trong đó, một lần nữa, là công bằng đủ). Vì vậy, câu hỏi của tôi là: có cách nào với bộ tiền xử lý phát hiện rằng intptr_t
thực sự là int
và, trong trường hợp đó, không biên dịch hàm tạo với int
. Hoặc, có một cách khác để làm cho ký hiệu A a(0)
hợp lệ mà không thêm hàm tạo với int
, nhưng không loại bỏ một trong hai hàm tạo đầu tiên (và không làm cho chúng ngầm định).
Bạn không thể loại bỏ hàm tạo A (A * khác) và thay thế bằng A (A & khác). Nó sẽ có vẻ tự nhiên hơn với tôi (giả sử bạn đang sao chép khác và không chaining). –