Есть несколько способов добиться этого.Одним из них является объединение шаблонных функций с перегрузкой функций:
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;
}
Другой способ заключается в частичной специализации шаблона класса (шаблоны функций не могут быть частично специализированы) для обработки тегового аргумента шаблона, который сообщает ему, что значение является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;
}