これを実現するにはいくつかの方法があります。1 つは、テンプレート化された関数を関数のオーバーロードと組み合わせることです。
template<typename T>
void print_error(T msg)
{
::MessageBox(0, reinterpret_cast< LPCSTR >(msg), "Error", MB_ICONERROR|MB_OK);
cout << msg << endl;
}
void print_error(const std::string& msg)
{
::MessageBox(0, reinterpret_cast< LPCSTR >(msg.c_str()), "Error", MB_ICONERROR|MB_OK);
cout << msg << endl;
}
int main()
{
string test = "test";
print_error(test);
print_error("test");
return 0;
}
もう 1 つの方法は、値が std::string であることを伝えるタグ付きテンプレート引数を処理するために、クラス テンプレートを部分的に特殊化することです (関数テンプレートは部分的に特殊化することはできません)。
template <typename T>
class StringArgument{};
template <typename T>
struct ErrorPrinter
{
static void print_error(T msg)
{
::MessageBox(0, reinterpret_cast< LPCSTR >(msg), "Error", MB_ICONERROR|MB_OK);
}
};
template <typename T>
struct ErrorPrinter<StringArgument<T> >
{
static void print_error(T msg)
{
::MessageBox(0, reinterpret_cast< LPCSTR >(msg.c_str()), "Error", MB_ICONERROR|MB_OK);
}
};
int main()
{
string test = "test";
ErrorPrinter<const char*>::print_error("sdfsdfsdf");
ErrorPrinter<StringArgument<string> >::print_error(test);
return 0;
}