在C++中,使用模板函数调用指针值的模板函数

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它指向的话调用它就会做同样的事情.

Tar*_*ama 6

模板函数的整个主体需要针对它实例化的类型进行编译,无论是否将采用分支.为了解决这个问题,你可以定义单独的函数,什么时候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)