我希望有一个函数模板来实现任意类型的转换:
template<typename T, typename S>
S Convert(const T& input)
{
// code.....
}
例如:
Convert<int, std::string>(12); // convert int to std::string
Convert<std::string, CString>("test"); // convert std::string to CString
Convert<bool, int>(true); // convert bool to int
有可能吗?
答案 0 :(得分:2)
您可以从以下主要功能模板开始:
template<typename T, typename S>
S Convert(const T& input) {
return static_cast<S>(input);
}
这适用于将bool
转换为int
。但是,对于其他更详细的转换,您需要为所涉及的类型完全专门化该模板。您必须定义相应转换的语义。
例如,将int
转换为std::string
的专业化可能是:
template<>
std::string Convert<int, std::string>(const int& input) {
return std::to_string(input);
}
将std::string
转换为CString
的专业化可能是:
template<>
CString Convert<std::string, CString>(const std::string& input) {
return CString(input.c_str());
}
对于更安全的功能,请考虑上面的定义(阅读documentation)。请注意,关于OP的问题,交换了模板参数的顺序。
// (0) primary function template
template<typename TDst, typename TSrc>
TDst Convert(const TSrc& input) {
return static_cast<TDst>(input);
}
// (1) specialization for converting int to string
template<>
std::string Convert<std::string, int>(const int& input) {
return std::to_string(input);
}
// (2) overload for necessary std::string
template<typename TDst = CString>
TDst Convert(std::string& str) {
return str.c_str();
}
// (3) overload for literal strings
template<typename TDst = CString>
TDst Convert(const char *cstr) {
return cstr;
}
那样:
Convert<int>(true); // (0)
Convert<std::string>(12); // (1)
std::string str("foo");
Convert<CString>(str); // (2)
Convert<CString>("foo"); // (3)
Convert<CString, std::string>("foo"); // <-- compile error