我只想将以下方法扩展为更通用的方法,它应该接受任何类型的参数并使用MessageBox()显示它:
void alert(char *item)
{
MessageBox(NULL, item, "Message", MB_OK | MB_ICONINFORMATION);
}
有人可以帮忙吗?
答案 0 :(得分:3)
#include <sstream>
template<typename T>
void alert(T item)
{
//this accepts all types that supports operator <<
std::ostringstream os;
os << item;
MessageBoxA(NULL, os.str().c_str(), "Message", MB_OK | MB_ICONINFORMATION);
}
//now you need specialization for wide char
void alert(const wchar_t* item)
{
MessageBoxW(NULL, item, "Message", MB_OK | MB_ICONINFORMATION);
}
答案 1 :(得分:2)
您可以写下类似内容:
template<typename T>
void alert(T item)
{
MessageBox(NULL, boost::lexical_cast<std::string>(item).c_str(), "Message", MB_OK | MB_ICONINFORMATION);
}
您应该将boost::lexical_cast
专门用于您想要的任何参数类型,因为它支持的范围有限。
另一种方法是使用boost::format
:
// helper class
class msg_helper_t {
public:
msg_helper_t(const char* msg ) : fmt(msg) {}
~msg_helper_t() {
MessageBox(NULL, str( fmt ).c_str(), "Message", MB_OK | MB_ICONINFORMATION);
}
template <typename T>
msg_helper_t& operator %(const T& value) {
try {
fmt % value;
} catch ( std::exception e ) {
// some exceptional actions
}
return *this;
}
template <>
msg_helper_t& operator %(const CString& value) {
try {
fmt % value.GetString();
} catch ( std::exception e ) {
// some exceptional actions
}
return *this;
}
protected:
boost::format fmt;
};
// our message function
msg_helper_t MyMsgBox(const char* msg) { return msg_helper_t( msg ); }
稍后可以按以下方式使用:
MyMsgBox( "Hello with %d arguments: %s" ) % 2 % "some text";
MyMsgBox( "%d" ) % 123456;
MyMsgBox( "%f" ) % 10.5f;
答案 2 :(得分:-1)
由于C ++是静态类型的,你可能需要做以下两件事之一:
toString()
”函数(Java / .NET方法)。这里的缺点是alert()
现在只适用于该类层次结构中的类型。此外,如果您使用ANSI字符串,则应确保使用MessageBoxA
,否则您应该考虑使用TCHAR和MessageBox或wchar_t和MessageBoxW。