Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板进行函数模板专门化_C++_Templates_Typetraits - Fatal编程技术网

C++ 使用模板进行函数模板专门化

C++ 使用模板进行函数模板专门化,c++,templates,typetraits,C++,Templates,Typetraits,我有一个函数模板,专门用于各种类型。但是,我想为指针定义一个模板专门化 为了澄清,这是现行规范的一部分: template<typename T> inline T Get(int i); /* ... */ template<> inline bool Get(int index) { //... } template<> inline std::string Get(int index) { //... } 这里有什么选项?您不能部分专门

我有一个函数模板,专门用于各种类型。但是,我想为指针定义一个模板专门化

为了澄清,这是现行规范的一部分:

template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
    //...
}
template<> inline std::string Get(int index) {
    //...
}

这里有什么选项?

您不能部分专门化函数模板,您的尝试实际上创建了一个不同的重载模板。在没有所有SFINAE干扰的情况下,最干净的方法是将其包装在一个类模板中,您可以对其进行部分专门化,然后编写一个函数模板,将其分派到相应的类模板专门化:

template <class T>
struct do_get;

template <>
struct do_get<bool> {
    static bool get(int i) { /*...*/ }
};

template <class T>
struct do_get<T*> {
    static T* get(int i) { /*...*/ }
};

template <class T>
T Get(int i) { return do_get<T>::get(i); }
模板
结构做得到;
模板
结构你得到了吗{
静态bool-get(inti){/*…*/}
};
模板
结构你得到了吗{
静态T*get(int i){/*…*/}
};
模板
T Get(int i){return do_Get::Get(i)}


另一种方法是当
T
是指针时,使用
enable\u显式禁用未定义的基本模板,但是,如果你想添加额外的重载,这很快就会变得非常困难。

你对返回类型的模板函数专门化无效。你不能部分专门化函数模板。@billz你是说第一个还是第二个代码段?@billz第一个部分确实工作得很好。你怎么称呼它<代码>获取(1)
?如何确保编译器调用正确的函数。
template <class T>
struct do_get;

template <>
struct do_get<bool> {
    static bool get(int i) { /*...*/ }
};

template <class T>
struct do_get<T*> {
    static T* get(int i) { /*...*/ }
};

template <class T>
T Get(int i) { return do_get<T>::get(i); }