2017-11-23 68 views
5

Tôi muốn tạo lớp có thể chuyển đổi thành lớp khác với thông số mẫu. Dưới đây là MCE về những gì tôi muốn đạt được:Có thể suy ra loại chuyển đổi thành loại templated trong C++ không?

#include <iostream> 

template <typename T> 
class A { 
    T value; 
public: 
    A(T value) {this->value = value;} 
    T getValue() const {return value;} 
}; 

class B { 
    int value; 
public: 
    B(int value) {this->value = value;} 
    operator A<int>() const {return A(value);} 
}; 

template <typename T> 
void F(A<T> a) {std::cout << a.getValue() << std::endl;} 

void G(A<int> a) {std::cout << a.getValue() << std::endl;} 

int main() 
{ 
    B b(42); 

    F(b);   // Incorrect 
    F((A<int>)b); // Correct 
    G(b);   // Also correct 
} 

Có thể làm F(b) dụ làm việc nếu cả hai class Avoid F là hàm thư viện và không thể được modifyed?

+3

Không. Gọi 'F' giống như bạn có nghĩa là khấu trừ đối số mẫu. Điều này có nghĩa là các chuyển đổi không được xem xét. Tuy nhiên, bạn có thể gọi 'F (b) '. – StoryTeller

+1

Tùy thuộc vào thiết kế và trường hợp sử dụng, có thể làm cho 'B' kế thừa từ' A' thay thế? Có thể sử dụng thừa kế 'private'? –

Trả lời

4

này:

F(b); 

đòi hỏi mẫu luận trích. Kết quả là, nó sẽ không làm những gì bạn muốn.

Hãy thử qua một cách rõ ràng mẫu đối số, như thế này:

F<int>(b); 

kể từ khi bạn cung cấp cho một nhà điều hành () trong class B.

Các vấn đề liên quan