Sth*_*ing 1 c++ templates pointers c++11
我试图为我的调用函数中作为模板参数给出的指针调用模板函数.我的代码是:
template <>
struct serialize_helper<std::string> {
// not important code...
}
};
template <class T>
inline void serializer(const T& obj, StreamType::iterator& res) {
if(std::is_pointer<T>::value)
{
//THIS doesn' work
serialize_helper<*T>::apply(*obj,res);
}
else
serialize_helper<T>::apply(obj,res);
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话:
std::string test("test");
serializer(test, res);
Run Code Online (Sandbox Code Playgroud)
一切正常.但我也希望能够使用指针调用序列化程序作为obj:
std::string test* = new std::string("test");
serializer(test, res);
Run Code Online (Sandbox Code Playgroud)
在调用序列化函数之前取消引用指针不是一个可能的选择,请不要这样做.在串行器功能内部是可能的.
更简短的描述:我想serializer用a 来调用std::string*并且如果我用std::string它指向的话调用它就会做同样的事情.
模板函数的整个主体需要针对它实例化的类型进行编译,无论是否将采用分支.为了解决这个问题,你可以定义单独的函数,什么时候T是指针,什么时候不是.
使用SFINAE:
template <class T, std::enable_if_t<std::is_pointer<T>::value>* = nullptr>
inline void serializer(const T& obj, StreamType::iterator& res) {
serialize_helper<std::remove_pointer_t<T>>::apply(*obj,res);
}
template <class T, std::enable_if_t<!std::is_pointer<T>::value>* = nullptr>
inline void serializer(const T& obj, StreamType::iterator& res) {
serialize_helper<T>::apply(obj,res);
}
Run Code Online (Sandbox Code Playgroud)
使用tagged-dispatch:
template <class T>
inline void serializer(const T& obj, StreamType::iterator& res, std::true_type) {
serialize_helper<std::remove_pointer_t<T>>::apply(*obj,res);
}
template <class T>
inline void serializer(const T& obj, StreamType::iterator& res, std::false_type) {
serialize_helper<T>::apply(obj,res);
}
template <class T>
inline void serializer(const T& obj, StreamType::iterator& res) {
serializer(obj, res, std::is_pointer<T>());
}
Run Code Online (Sandbox Code Playgroud)