C++ 模板函数映射特定类型并保持所有其他类型不变
我正在使用Boost序列化带有折叠表达式的模板包。序列化:C++ 模板函数映射特定类型并保持所有其他类型不变,c++,templates,variadic-templates,c++17,template-specialization,C++,Templates,Variadic Templates,C++17,Template Specialization,我正在使用Boost序列化带有折叠表达式的模板包。序列化: template <typename ... Args> std::string toBytes(Args... args) { std::ostringstream buf; boost::archive::binary_oarchive arch(buf); (arch << ... << args); return buf.str(); } 但是这个代码给出了
template <typename ... Args>
std::string toBytes(Args... args)
{
std::ostringstream buf;
boost::archive::binary_oarchive arch(buf);
(arch << ... << args);
return buf.str();
}
但是这个代码给出了
错误C2912:显式专门化“charptrwraper f(char*)”不是函数模板的专门化
这有什么问题?我该如何解决这个问题
这有什么问题?我该如何解决这个问题
问题是你的专业化不是专业化
通用的f()
定义为:
template<typename T>
T f(T x) { return x; }
不是f()
的有效专门化,因为它接收char*
并返回charptrrapper
f()
的几个有效专门化是:
template <>
char const * f<char const *>(char const * x) { return x; }
// or
template <>
char const * f(char const * x) { return x; }
或者更好的是,接收一个
char const*
而不是char*
一个专业化必须在主模板之后。无论如何,请考虑使用重载代替。<代码> CARPrTrRAPPER F(CHAR*X)< /C> >不匹配<代码> T f(tx)< /> >它吗?
template<>
CharPtrWrapper f(char * x);
template <>
char const * f<char const *>(char const * x) { return x; }
// or
template <>
char const * f(char const * x) { return x; }
CharPtrWrapper f(char * x) { return CharPtrWrapper(x); }