模板函数映射特定类型和保留所有其他不变

我使用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

回到顶部