将任何类型转换为任何类型

时间:2018-02-15 16:24:57

标签: c++ c++11 templates type-conversion

我希望有一个函数模板来实现任意类型的转换:

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

有可能吗?

1 个答案:

答案 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