Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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

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_Template Specialization - Fatal编程技术网

C++ 没有对象参数专门化的模板函数

C++ 没有对象参数专门化的模板函数,c++,templates,template-specialization,C++,Templates,Template Specialization,我想专门化一个模板函数来获取非指针类型,如果它得到一个指针,我想调用它而不使用* 我想知道是否有不使用std::remove\u指针的方法 例如,我想做这样的事情: template<typename T> void setName() { name = __PRETTY_FUNCTION__; } template<typename T> void setName<T*>() { setName<T>(); } 模板 void

我想专门化一个模板函数来获取非指针类型,如果它得到一个指针,我想调用它而不使用*

我想知道是否有不使用std::remove\u指针的方法

例如,我想做这样的事情:

template<typename T>
void setName() {
    name = __PRETTY_FUNCTION__;
}

template<typename T>
void setName<T*>() {
    setName<T>();
}
模板
void setName(){
名称=\uuuu漂亮的函数\uuuuu;
}
模板
void setName(){
setName();
}

<代码>名称>代码>定义为私有数据成员。

您的想法是正确的,但C++中不允许部分函数模板特化。例如,允许部分类模板专门化,因此您可以使用静态方法解决方法(请参阅下面的
setName\u impl
专门化),如果需要,还可以使用函数模板包装器(请参阅下面的
setName()
):

模板
结构setName_impl{
静态void exec(){}
};
模板
结构setName_impl{
静态void exec(){
setName::exec();
}
};
模板
void setName(){
setName_impl::exec();
}

你试过了吗?@CrazyEddie是的,我得到了“'template void Type::setName()'不能重载”,但我希望setName是一个函数,而不是一个struct@Loay它是包含静态方法的结构。请看我刚才添加的答案的结尾。只需创建一个调用此结构的静态方法的函数,这可能是最简单的方法<代码>模板void setName(){name=setNameImpl::exec();}我编辑了答案并添加了所需的包装函数模板。
template<typename T>
struct setName_impl{ 
    static void exec() { }
};

template<typename T>
struct setName_impl<T*>{ 
    static void exec() {
        setName<T>::exec();
    }
};

template<typename T>
void setName() { 
    setName_impl<T>::exec(); 
}