模板函数映射特定类型和保留所有其他不变
我使用Boost.Serialization序列化模板包带折叠式:模板函数映射特定类型和保留所有其他不变
template <typename ... Args> std::string toBytes(Args... args) 
{ 
    std::ostringstream buf; 
    boost::archive::binary_oarchive arch(buf); 
    (arch << ... << args); 
    return buf.str(); 
} 
这工作不错,但是当我尝试将指针序列化到一些基本的键入(例如,char*),它会窒息它。我明白,Boost.Serialization不会按意图将这些类型序列化。所以,我想提供一个“默认”方式来序列化它们。
为了实现这个目标我希望每个args元素通过一些功能f映射,使f(char*)将返回CharPtrWrapper和其他类型的f应该工作身份的功能。
我的做法是:
template<typename T> T f(T x) { return x; } 
template<> 
CharPtrWrapper f(char * x) { return CharPtrWrapper(x); } 
但是这个代码给
的专业化错误C2912:明确的专业化 'CharPtrWrapper F(字符*)' 不是一个函数模板
这是怎么回事,我该如何解决这个问题?
回答:
这是怎么回事,我该如何解决这个问题?
问题是你的专业化不是专业化。
通用f<>()定义为:
template<typename T> T f(T x) { return x; } 
即,接收输入T并返回相同类型的模板函数。所以,f<>()的专门化必须返回它接收的相同类型。
然而,
template<> CharPtrWrapper f(char * x); 
不是f<>()有效的专业化,因为它接受char *,并返回CharPtrWrapper。
为f<>()一些有效的专业有:
template <> char const * f<char const *>(char const * x) { return x; } 
// or 
template <> 
char const * f(char const * x) { return x; } 
一种解决方案,通过N.M.的建议,是避免专业化和超载使用来代替。这意味着,从实用的角度来看,删除“template<>”的一部分,只是写:
CharPtrWrapper f(char * x) { return CharPtrWrapper(x); } 或更好,但收到char const *而不是char *。
以上是 模板函数映射特定类型和保留所有其他不变 的全部内容, 来源链接: utcz.com/qa/262713.html

