2016-08-23 22 views
5

Mã Java sau đây gọi phương thức tĩnh printText(text) trên tham số generics T đại diện cho một lớp dẫn xuất là Printer. Có thể đạt được chính xác hành vi tương tự trong C++ không? Nếu có, làm thế nào?Gọi hàm tĩnh trên tham số mẫu trong C++

public class Printer { 

    public static void printText(String text) { 
     System.out.println(text); 
    } 

    public static <T extends Printer>void print(String text) { 
     T.printText(text); 
    } 

    public static void main(String[] args) { 
     Printer.print("Hello World!"); 
    } 

} 

Trả lời

7

Vâng, nó có thể:

template <typename T> 
void print(const std::string& text) 
{ 
    T::printText(text); 
} 

Để chắc chắn rằng Printer là một cơ sở của T, bạn có thể thêm kiểm tra thời gian biên dịch này để các chức năng:

static_assert(std::is_base_of<Printer, T>::value, "T must inherit from Printer"); 
+1

Hoặc để linh hoạt hơn, hãy kiểm tra xem 'T' có phải là một' static'' tĩnh 'http://stackoverflow.com/questions/23133683/how-to-detect-the-presence-of-a-static-member-function- có chữ ký nhất định – Garf365

3

Bạn có thể làm điều này

struct A 
{ 
    static void printMe() 
    { 
     std::cout << "A print \n"; 
    } 
}; 

struct B 
{ 
    static void printMe() 
    { 
     std::cout << "B print \n"; 
    } 
}; 


template<typename T> void printer() 
{ 
    T::printMe(); 
} 

int main() { 

    printer<A>(); 
    printer<B>(); 
    return 0; 
} 
Các vấn đề liên quan