Có thể tham khảo mẫu chuyển đổi do người dùng xác định trong khai báo sử dụng không?


8

Trong một lớp Bkế thừa từ lớp A, có thể sử dụng một usingkhai báo để đưa các thành viên Avào B, thậm chí các mẫu, như thế này:

struct A {
    template <typename T>
    void foo();
};

struct B : private A {
    using A::foo;
};

Nhưng nó có thể được thực hiện cho các mẫu chuyển đổi?

struct A {
    template <typename T>
    operator T();
};

struct B : private A {
    using A::operator /* ??? */;
};

Dường như không có cách nào để đề cập đến mẫu theo tên, nhưng tôi rất muốn được chứng minh là sai hoặc nhận được một số làm rõ.


1
Trường hợp sử dụng là gì?
R Sahu

@RSahu Có lẽ để kế thừa một hàm tạo chuyển đổi mà không yêu cầu thừa kế công khai.
Ayjay

@Ayjay, nếu đó là trường hợp, thì việc sử dụng privatequyền thừa kế là không hợp lý, IMO.
R Sahu

@RSahu Ayjay là chính xác. Để cụ thể hơn, tôi muốn cho phép một số lớp Ckế thừa B, nhưng Ckhông nên có quyền truy cập vào Acác phương thức được bảo vệ. Tuy nhiên, tôi muốn Acác phương thức công khai vẫn được công khai, bao gồm cả toán tử chuyển đổi này. Tôi biết tôi có thể giải quyết vấn đề này theo một số cách, nhưng tôi muốn tránh viết thêm mã cho lợi ích nhỏ như vậy.
Táo

@Apples, có vẻ như lỗ hổng thiết kế. Tôi không biết bạn có bao nhiêu quyền kiểm soát đối với các lớp này. Nếu bạn có quyền kiểm soát những gì đi vào A, bạn có thể tách Athành hai lớp - một lớp Bcó thể kế thừa publicly và lớp kia private.
R Sahu

Câu trả lời:


3

Như một giải pháp thay thế, bạn có thể chuyển sang lớp cơ sở và chuyển đổi nó một cách rõ ràng:

struct A {
    template <typename T>
    operator T() {
        return T{};
    }
};

struct B : private A {
    template <class T>
    operator T() {
        return static_cast<T>(static_cast<A&>(*this));
    }
};

int main() {
    A a;
    B b;
    int i_a = a;
    int i_b = b;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.