2016-08-23 137 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; 
}