2

当我尝试这样做时,我只是在搞乱模板:

template<typename T> void print_error(T msg)
{
#ifdef PLATFORM_WIN32
    ::MessageBox(0, reinterpret_cast< LPCSTR >(msg), "Error", MB_ICONERROR|MB_OK);
#else
    cout << msg << endl;
#endif /* PLATFORM_WIN32 */
}

当然,如果您传递std::stringas ,这显然不起作用T。因为字符串不能转换为char*,但是这个函数是否可以以允许我同时传递 c 样式char*数组和 c++std::string作为参数的方式进行编码,并将它们转换为LPCSTR

4

5 回答 5

5

您可以使用函数重载:

void print_error(char const* msg);
void print_error(std::string const& msg);
...
于 2012-01-25T11:22:16.073 回答
3

这会起作用:

#include <sstream>

template<typename T> void print_error(T msg)
{
    std::ostringstream s;
    s << msg;

#ifdef PLATFORM_WIN32
    ::MessageBox(0, s.str().c_str(), "Error", MB_ICONERROR|MB_OK);
#else
    cout << s.str() << endl;
#endif /* PLATFORM_WIN32 */
}
于 2012-01-25T11:23:45.383 回答
2

有几种方法可以实现这一点。一种是将模板化函数与函数重载相结合:

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;
}
于 2012-01-25T13:35:17.927 回答
1

为了稍微详细说明 hmjd 提供的解决方案,这个解决方案应该适用于任何字符串输入,也适用于整数等。它也应该适用于在 Windows 上激活的 unicode。

#include <sstream>

template<typename T> void print_error(T msg)
{
#ifdef PLATFORM_WIN32
    std::basic_ostringstream< TCHAR > ss;
    ss << msg;
    ::MessageBox(0, ss.str().c_str(), "Error", MB_ICONERROR|MB_OK);
#else
    cout << msg << endl;
#endif /* PLATFORM_WIN32 */
}
于 2012-01-25T13:51:31.893 回答
1

如果 T 是 char* 则可以启用 print_error 否则它将是编译时错误,即(您需要包括 type_traits 和 c++11):

template<typename T> 
typename std::enable_if< std::is_same<T, char*>::value, void>::type print_error(T msg)
{
    ::MessageBox(0, reinterpret_cast< LPCSTR >(msg), "Error", MB_ICONERROR|MB_OK);
    cout << msg << endl;
}
于 2012-01-26T09:31:27.023 回答