2016-08-23 15 views
5

次のJavaコードは、派生クラスPrinterを表すジェネリックパラメータTで静的メソッドprintText(text)を呼び出します。 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

また、より柔軟にするためには、静的 'printText'として' T'をチェックしてください。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; 
} 
関連する問題