模板函数映射特定类型和保留所有其他不变
我使用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