0

我使用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(字符*)' 不是一个函数模板

的专业化

这是怎么回事,我该如何解决这个问题?

+5

专业化必须在主模板之后。无论如何,请考虑使用重载。 –

+0

'CharPtrWrapper f(char * x)'不完全匹配'T f(T x)'做到了吗? – rustyx

回答

1

这是怎么回事,我该如何解决这个问题?

问题是你的专业化不是专业化。

通用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 *

相关问题