C++ 没有对象参数专门化的模板函数
我想专门化一个模板函数来获取非指针类型,如果它得到一个指针,我想调用它而不使用* 我想知道是否有不使用std::remove\u指针的方法 例如,我想做这样的事情: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
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();
}