有幾種方法來實現這一目標。其一是模板函數與函數重載組合:
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;
}
另一種方式是部分專業類模板(函數模板不能是部分專業)來處理標籤模板參數告訴它該值的標準: :字符串:
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;
}
什麼是'reinterpret_cast'的目的在這段代碼中,除了召喚煩惱? –
請注意''MessageBox'需要**'LPCTSTR' **,這是一個寬字符串或一個窄字符串,取決於許多因素。我的猜測是,如果你想要通用和安全,你必須以某種方式複製字符串。你應該決定一個內部表示(也許UTF-8,所以你總是使用'char *'或'std :: string'),並在'MessageBox'調用位置轉換爲正確的Windows類型。請注意,Windows可能會要求您使用'wcout',而在Linux上,您應該始終使用'cout'。 –
您可以通過測試'#ifdef _UNICODE'來測試'LPCTSTR'是否由寬字符組成。 Windows上的Unicode意味着(時下)UTF-16。 –