2016-08-23 76 views
5

以下Java代碼調用泛型參數T上的靜態方法printText(text),該參數代表派生類Printer。是否有可能在C++中實現完全相同的行爲?如果是,如何?在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!"); 
    } 

} 

回答

7

是的,這是可能的:

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

爲了確保PrinterT基地,你可以在這個編譯時檢查添加到函數:

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

或者爲了更靈活,請檢查'T'是否爲靜態'printText' http://stackoverflow.com/questions/23133683/how-to-detect-the-presence-of-a-static-member-function-與-某些簽名 – Garf365

3

你可以這樣做

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; 
}