gpt4 book ai didi

c++ - 映射特定类型并保持所有其他不变的模板函数

转载 作者:行者123 更新时间:2023-11-28 04:52:24 25 4
gpt4 key购买 nike

我正在使用 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 不会故意序列化这些类型。因此,我想提供一种“默认”方式来序列化它们。

为了实现这一点,我想通过一些函数 f 映射每个 args 元素,这样 f(char*) 就会返回 CharPtrWrapper 和其他类型,f 应该作为身份函数。

我的方法是:

template<typename T>
T f(T x) { return x; }

template<>
CharPtrWrapper f(char * x) { return CharPtrWrapper(x); }

但是这段代码给出了

error C2912: explicit specialization 'CharPtrWrapper f(char *)' is not a specialization of a function template

这有什么问题,我该如何解决这个问题?

最佳答案

What's wrong with that and how do I solve this problem?

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

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

关于c++ - 映射特定类型并保持所有其他不变的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47866984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com